算法题心得 - 其他小技巧

前面的文章介绍了数组,哈希表,字符串,链表,树等常见数据结构。本小结补充一些其他的小技巧

二进制运算

面试题15:二进制中1的个数

题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1。因此,如果输入9,则该函数输出2.

常规的思想,可以判断此数是否是奇数,如果是奇数,则1的个数增加,此数右移一位,循环判断,直到右移后的结果为0。但实际上,这里有个小陷阱,因为右移的操作有时会有额外的问题,比如一个负数-1在右移后,还是-1,这样循环就无法结束了。另一个思路,是做一个flag标志位,初始化为1,和原数做&,如果为1,则1的个数增加,最后将flag左移,用来判断下一位。

这里,主要是想给大家介绍一个新的思路,利用了二进制位运算特征,我们可以很巧妙的解决这个问题。
这里需要理解的特征就是0&0=0,0&1=0,1&0=0,1&1=1,即0&x=0,1&x=x,这里x为0或1,假如说有一个二进制数0b00100000,其中有一位是1,我们不妨让这个数减1,则数变成了0b00011111,这两个数&一下,就变成了0b0。我们可以发现一个规律,如果一个数为n,则n & (n - 1)可以消去数中最右面的1。

有了上面的思路,我们可以设计出新的解决方案,不断的消除数中最后一个1,并统计个数,直到这个数变为0。

斐波那契数列

另一类比较典型的问题就是斐波那契数列的问题了
面试题10:斐波那契数列

题目一:求斐波那契数列的第n项
写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下:
f(0)=0,
f(1)=1,
f(n)=f(n-1)+f(n-2),n>1

实际上,斐波那契数列,是一个典型的递归题。比如,我要计算f(10)的值,则可以递归到f(8)+f(9),而f(8)和f(9)都可以分别递归,直到f(0)或f(1)。这种思路显然是可以解决这个问题的。但是,这种简单的处理,计算量是非常庞大,而且有很多不必要的重复的。

为什么这么说呢?我们看看下面的推导:

f(10) = f(8) + f(9)
f(9) = f(7) + f(8)
f(8) = f(6) + f(7)
f(7) = f(5) + f(6)
f(6) = f(4) + f(5)
f(5) = f(3) + f(4)
f(4) = f(2) + f(3)
f(3) = f(1) + f(2)
f(2) = f(0) + f(1)
f(1) = 1
f(0) = 0

从中我们可以看出,中间,有大量的重复项,我们在计算的时候,如果每一项都是采用递归的方案,显然会多计算很多。比如在计算f(10)的时候,需要首先计算f(8)的值,而计算f(9)的时候,也需要计算f(8)的值,这样,f(8)实际上被计算了两次,但实际上这是没有必要的。

我们在解决递归相关的问题时,往往分析的时候,是自上而下的,比如刚才的分析,就是为了计算f(10),我们首先需要计算f(8)和f(9),为了计算f(8),首先需要计算f(6)和f(7)等等。这些都是自上而下的分析。但是如果在实际计算的时候,也采用自上而下的方案,就会产生不必要的浪费。因此在计算的时候,我们采用自下而上的方案,也就是说从f(0)和f(1)推导出f(2),由f(1)和f(2)推到出f(3)等等。这个推导的过程是自下而上的,这样做的好处是,可以利用历史的计算信息,这样,就不会产生同一个值被计算两次的情况了,从而化简了计算复杂度。

小结

本章介绍了一些其他技巧,比如在计算二进制中1的个数的时候,我们可以利用n & (n - 1)可以消掉最右边1的特征,进行分析计算。还有在分析递归类型问题时,我们采用自上而下的方案,而在具体计算的时候,我们采用自下而上的方案,这样,可以使用历史计算数据,从而减少不必要的计算。

至此,算法题小结这一系列就到此结束了。后面如果还有新的心得,我再在后面做补充。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容