Trilogy公司的笔试题:

如果n为偶数,则将它除以2,如果n为奇数,则将它加1或者减1。问对于一个给定的n,怎样才能用最少的步骤将它变到1。
    例如:n=11: ① ++n -> 12 ② n/2 -> 6 ③ n/2 -> 3   ④ --n -> 2  ⑤ n/2 -> 1  共需5步。

最简单的方法就是用DP。设f(n)为所用的最少步骤。根据定义可得:

若n为偶数, f(n)=f(n/2) + 1;

若n为奇数, f(n)= min(f(n-1), f(n+1)) +1

= min(f((n-1)/2), f((n+1)/2)) +2

或者:

f(2*k)=f(k)+1

f(2*k+1)=min(f(k),f(k+1))+2

利用上述递推公式,可以直接从数字1开始算到n,用一个数组保存前 n/2+1个数所用的最少步骤,但这时间和空间复杂度均为O(n),其实利用上面的递推公式,可以实现时间复杂度为0(lg n)。观察上面的递推公式,可以发现,要计算n,只要计算n/2和n/2+1,如要计算59,只要计算:

59 -> 29,30 -> 14,15 -> 7,8 -> 3,4 -> 1,2。

代码如下:

int num2one_dp(unsigned n)
{
  unsigned tmp=n, flag=1, ret=0, next=1;
  while (tmp>>=1) flag<<=1;
  while (flag>>=1) {
    if (n & flag) {
      if (ret > next) ret = next;
      ret += 2;
      ++next;
    } else {
      if (next > ret) next = ret;
      next += 2;
      ++ret;
    }
  }
  return ret;
}

上面的O(lg n)解法,对n先处理高位的0和1,下面的O(lg n)解法则恰恰相反,先处理n的低位的0和1。

将n(n>1)转为二进制数表示

(下面的“加1”、“减1”操作均特指对奇数采取的操作,操作次数包括对偶数的操作次数。)

⑴ 如果n仅由m个连续的1组成(即n=2^m-1, m>=2),

① “加1”操作: 需要 m+1 次操作

② “减1”操作: 需要 2*(m-1) 次操作

显然,仅当m=2(即n=3)时,“减1”所用的操作次数才比“加1”少。

⑵ 如果n可以表示为:x10m1k (m>=1, k>=1)

(x可以为空串或任意01序列,0m表示连续m个0,1k表示连续k个1)

① “加1”操作: k+1 次操作后得到x10m-11如果,接着用“减1”操作(注意,这不这一定最优解法),总共k+3次操作可得x10m-1

②“减1”操作: 2*k+1次操作后得到x10m-1

显然,仅当k=1时,“减1”所用的操作次数才可能比“加1”少。

可以证明,对x10m1,“减1”所用的操作次数一定不会比“加1”的多。

(当k=1时,对x10m1,假设先进行一次“加1”操作最终所用的步骤数较少。“加1”操作后,在将x10m1转为x11前,若用到“减1”操作,则可以直接对x10m1进行 “减1”操作,所有步骤更少,因而后面都是采用“加1”操作。

对x10m1(可表示为y01t0m1,y允许是空串),

 “加1”操作   2*m+t+2 次后得到  y1

“减1”操作      m+2 次后得到 y01t

(再用“加1操作”,m+t+3后也可得到y1)

由于对m>=1,恒有m+t+3 <= 2*m+t+2,因而对x10m1

“减1”操作能保证得到最优解。)

⑶ 总之,仅当n=3或n二进制表示的最低2位是01时,才用“减1”操作

代码:

int num2one(unsigned n)
{
  if (n==0) return -1;
  int count=0;
  while (1) {
    while ((n&1)==0) { n >>= 1u; ++count; }
    if (n<=3) {
      // n只能为1或3,n为3时,还要进行两步操作
      count += n - 1;
      break;
    }
    if ((n&3)==1)  --n;
    else ++n;
    ++count;
  }
  return count;
}

转载于:https://www.cnblogs.com/flyinghearts/archive/2011/01/01/1923590.html

Trilogy公司的笔试题:根据指定规则用最少的步骤将数转为1相关推荐

  1. 转贴:雅虎公司C#笔试题,看看你能解答多少

    这是刚在在网上看到了,觉得这些题目出得真不错,能考出一个程序员的基本功.所以先发在这里,做个备份,以后慢慢来做(偶好像只能免强及格哦,呵呵,关于网络的题目太多了,偶不太熟啊)- ----------- ...

  2. 阿里巴巴公司DBA笔试题

    阿里巴巴公司DBA笔试题 注:以下题目,可根据自己情况挑选题目作答,不必全部作答.您也可以就相关问题直接找负责面试人员面述而不笔答          一:SQL  tuning  类          ...

  3. Java面试题(一)100家大公司java笔试题汇总

    Java考试题 一:单选题 -– 1.下列哪一种叙述是正确的(D ) A. abstract修饰符可修饰字段.方法和类 B. 抽象方法的body部分必须用一对大括号{ }包住 C. 声明抽象方法,大括 ...

  4. 100家大公司java笔试题汇总

    NHN CHINA公司笔试题 1.在这写代码 Var array1 = [10,20]; Var array2 = [8,5]; Var result = array1.add(array2); Al ...

  5. 46家公司的笔试题,拿去练练手吧

    首先推荐下自己的独立小网站,一个可以在线制作.收录数万表情包的网站,欢迎大家访问:撸表情 原版是在微盘推荐里看到的,也不清楚是哪位有心人整理的,我先贴出来给大家瞧瞧,也替大家谢谢这位有心人!!欢迎一起 ...

  6. 46家公司面试笔试题

    Sony笔试题 1.完成下列程序 * *.*. *..*..*.. *...*...*...*... *....*....*....*....*.... *.....*.....*.....*.... ...

  7. 10、正则表达式 (笔试题、语法规则、正则对象方法、正则实例属性、支持正则表达式的String对象的方法、贪婪匹配与非贪婪匹配)

    正则表达式 目录 10.1 语法规则 10.1.1 创建方法 1.直接量 2.构造方法RegExp() 10.1.2 三个属性i,g,m 10.1.3 方括号 10.1.4 元字符 10.1.5 量词 ...

  8. 阿里巴巴公司 DBA笔试题及参考答案

    一:SQL tuning 类 1:列举几种表连接方式 hash join/merge join/nest loop(cluster join)/index join 2:不借助第三方工具,怎样查看 s ...

  9. 各个公司前端笔试题回顾

    http://www.cnblogs.com/huansky/p/5973655.html 去哪儿:两道简答题,两道编程题,蛮假单的. 简答题: 1.事件绑定的方法: 2.将location.sear ...

最新文章

  1. CVPR 2022官方发布重要通知,禁止审稿期公开传播论文,静默期4个多月
  2. 好书速递 | FPGA原理和结构
  3. Oracle精简客户端配置
  4. 写给新手的WebAPI实践
  5. MySQL中外键的定义、作用、添加和删除
  6. 项目管理——任务分配闲谈
  7. C# ocr识别(Tesseract库)
  8. 同步、异步、阻塞与非阻塞给你说得明明白白
  9. 案例|工业物联网解决方案•生产数据可视化
  10. 计算机系统存储器 分类,存储器的分类
  11. Winodws update auto update client(wuauclt)
  12. 三种嵌入式操作系统比较和分析
  13. Springboot物理地址映射和Nginx静态资源代理实现前端上传并访问服务器图片
  14. FreeRtos软件定时器复习
  15. Word文档重新打开时恢复到上次阅读位置
  16. 【鸟哥的linux初级笔记——01】
  17. asp网站怎么跳转html,用asp实现网页邮箱访问的方法
  18. OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
  19. 逃出你的肖申克(二):你的灯亮着吗?
  20. css字体 text,css文本样式text、字体样式font

热门文章

  1. 手机麦克风声音太大_全民K歌必备利器,得胜PH-125手机K歌麦克风让你轻松拥有好声音...
  2. ARC-060C - Tak and Cards - 动态规划
  3. qt 中如何播放声音(QSound)
  4. 虚基类(c++细节篇七)
  5. Flutter学习记录(一、Flutter环境搭建)
  6. Time to First Byte(TTFB)与Web性能优化
  7. SpringBoot中通过重写WebMvcConfigurer的addCorsMapping方法实现后台服务解决跨域问题
  8. Java调用net的Webservice时提示:undefined element declaration 's:schema'
  9. WebService入门简介教程
  10. 一行Java代码实现混乱排序List集合