Trilogy公司的笔试题:用最少的步骤将数转为1
来源:互联网 发布:数控车床g33螺纹编程 编辑:程序博客网 时间:2024/05/15 20:53
Trilogy公司的笔试题:
如果n为偶数,则将它除以2,
如果n为奇数,则将它加1或者减1。
问对于一个给定的n,怎样才能用最少的步骤将它变到1。
最简单的方法就是用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。
上面的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”操作。
- Trilogy公司的笔试题:用最少的步骤将数转为1
- Trilogy公司的笔试题:用最少的步骤将数N转为1
- Trilogy公司的笔试题
- Trilogy公司的笔试题
- 输入一个无符号整数,用最少的步骤将该数变为1
- 一个公司笔试题:出去旅游,只有固定的钱,住不同的旅店,最少可以住多少
- 问对于一个给定的n,怎样才能用最少的步骤将它变到1。--淘宝笔试题目
- 其他公司的笔试题1
- 一些公司的笔试题
- 一些公司的笔试题
- 关于php将浮点数转为整数的问题
- 将一个整形数转为ASCII码的算法
- 将整型或整型的毫秒数转为日期
- 奇偶数排序--整数数组的奇偶数分开(小米公司笔试题)
- 一个数以最少步骤分解为另外两个数和差问题的解决
- 一个数以最少步骤分解为另外两个数和差问题的解决
- 一个数以最少步骤分解为另外两个数和差问题的解决
- 钱的最少张数
- 转自CSDN论坛:好铁不打钉,好程序员不去外包公司
- ubuntu安装IE的方法
- 3dmax插件示例
- GDB手册
- 供应商Map如果没有则查询供应商
- Trilogy公司的笔试题:用最少的步骤将数转为1
- Planning Test Effort
- linux c 编程
- vss 总是报错Invalid handle(无效的句柄)
- 协和谬误:欲罢不能的困局(博弈论的诡计)
- makefile文件讲解
- Gsl在VC6.0上的配置
- 十万个百科知识问答1
- shell中参数的模式匹配