Trilogy公司的笔试题:根据指定规则用最少的步骤将数转为1
如果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。
代码如下:
{
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”操作
代码:
{
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相关推荐
- 转贴:雅虎公司C#笔试题,看看你能解答多少
这是刚在在网上看到了,觉得这些题目出得真不错,能考出一个程序员的基本功.所以先发在这里,做个备份,以后慢慢来做(偶好像只能免强及格哦,呵呵,关于网络的题目太多了,偶不太熟啊)- ----------- ...
- 阿里巴巴公司DBA笔试题
阿里巴巴公司DBA笔试题 注:以下题目,可根据自己情况挑选题目作答,不必全部作答.您也可以就相关问题直接找负责面试人员面述而不笔答 一:SQL tuning 类 ...
- Java面试题(一)100家大公司java笔试题汇总
Java考试题 一:单选题 -– 1.下列哪一种叙述是正确的(D ) A. abstract修饰符可修饰字段.方法和类 B. 抽象方法的body部分必须用一对大括号{ }包住 C. 声明抽象方法,大括 ...
- 100家大公司java笔试题汇总
NHN CHINA公司笔试题 1.在这写代码 Var array1 = [10,20]; Var array2 = [8,5]; Var result = array1.add(array2); Al ...
- 46家公司的笔试题,拿去练练手吧
首先推荐下自己的独立小网站,一个可以在线制作.收录数万表情包的网站,欢迎大家访问:撸表情 原版是在微盘推荐里看到的,也不清楚是哪位有心人整理的,我先贴出来给大家瞧瞧,也替大家谢谢这位有心人!!欢迎一起 ...
- 46家公司面试笔试题
Sony笔试题 1.完成下列程序 * *.*. *..*..*.. *...*...*...*... *....*....*....*....*.... *.....*.....*.....*.... ...
- 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 量词 ...
- 阿里巴巴公司 DBA笔试题及参考答案
一:SQL tuning 类 1:列举几种表连接方式 hash join/merge join/nest loop(cluster join)/index join 2:不借助第三方工具,怎样查看 s ...
- 各个公司前端笔试题回顾
http://www.cnblogs.com/huansky/p/5973655.html 去哪儿:两道简答题,两道编程题,蛮假单的. 简答题: 1.事件绑定的方法: 2.将location.sear ...
最新文章
- CVPR 2022官方发布重要通知,禁止审稿期公开传播论文,静默期4个多月
- 好书速递 | FPGA原理和结构
- Oracle精简客户端配置
- 写给新手的WebAPI实践
- MySQL中外键的定义、作用、添加和删除
- 项目管理——任务分配闲谈
- C# ocr识别(Tesseract库)
- 同步、异步、阻塞与非阻塞给你说得明明白白
- 案例|工业物联网解决方案•生产数据可视化
- 计算机系统存储器 分类,存储器的分类
- Winodws update auto update client(wuauclt)
- 三种嵌入式操作系统比较和分析
- Springboot物理地址映射和Nginx静态资源代理实现前端上传并访问服务器图片
- FreeRtos软件定时器复习
- Word文档重新打开时恢复到上次阅读位置
- 【鸟哥的linux初级笔记——01】
- asp网站怎么跳转html,用asp实现网页邮箱访问的方法
- OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
- 逃出你的肖申克(二):你的灯亮着吗?
- css字体 text,css文本样式text、字体样式font
热门文章
- 手机麦克风声音太大_全民K歌必备利器,得胜PH-125手机K歌麦克风让你轻松拥有好声音...
- ARC-060C - Tak and Cards - 动态规划
- qt 中如何播放声音(QSound)
- 虚基类(c++细节篇七)
- Flutter学习记录(一、Flutter环境搭建)
- Time to First Byte(TTFB)与Web性能优化
- SpringBoot中通过重写WebMvcConfigurer的addCorsMapping方法实现后台服务解决跨域问题
- Java调用net的Webservice时提示:undefined element declaration 's:schema'
- WebService入门简介教程
- 一行Java代码实现混乱排序List集合