C/C++面试之算法系列--从"反转32 位数"算法题分析面试策略

  【序】创新的源泉在哪?idea来自于analogy and imitation。下面第二种方法是我在分析原作者的思路时想到的,也就是借鉴模仿吧,让我突然觉得,如果每一个算法题目,要是能分析其精髓,举一反三,再来点创新,我相信不用把所有常考的算法都做一遍,我也能够应付,这才是我学习此算法得到的idear

                                                                                                                                                     
反转 32 位数
saior_forever  [email protected] 转载请注明
http://blog.csdn.net/sailor_8318/archive/2007/08/29/1764477.aspx
 
把一个 32 位的数按位反转,就是第 32 位转到第 1 位,第 31 位转到第 2 …………
什么样的算法最节省效率?
参考 http://www.yuanma.org/data/2007/0723/article_2763.htm
unsigned int bit_reverse ( unsigned int n )
{
       n
= (( n >> 1 ) & 0x55555555 ) | (( n << 1 ) & 0xaaaaaaaa );
       n
= (( n >> 2 ) & 0x33333333 ) | (( n << 2 ) & 0xcccccccc );
       n
= (( n >> 4 ) & 0x0f0f0f0f ) | (( n << 4 ) & 0xf0f0f0f0 );
       n
= (( n >> 8 ) & 0x00ff00ff ) | (( n << 8 ) & 0xff00ff00 );
       n
= (( n >> 16 ) & 0x0000ffff ) | (( n << 16 ) & 0xffff0000 );
       
return n ;
} 
第一行代码为奇偶位相互交换;第二行为以两位为一单元,奇偶单元进行交换;第三行为以四位为一单元,奇偶单元进行交换;第四行为以八位为一单元,奇偶单元进行交换;最后一行为以十六位为一单元,奇偶单元进行交换。至此, 32 位反转完成,算法结束。
 
上述奇偶、 2 4 8 16 的交换方法可以演变有 四种实现形式,本质一样 ,可以都先移后取、都先取后移以及一个先移后取、另一个先取后移
 
受上面程序启发,可以考虑 16 8 4 2 、奇偶来实现交换,即先将 左右整体换边,再处理局部换边的问题
 
32 位分成两个 16 位的箭头,折半互换有两种实现方式:
一,先把每个箭头换向,整体分别左移或右移 16 位,即可; 问题是每个箭头怎么换向?问题又成了 16 位数怎么折半互换 ,再分成两个 8 位的箭头,如上方法,依次实现,最后就是奇偶互换了, 可以形成递归算法 ;或者将 1 思路反相考虑 ,直接奇偶互换, 2 2 互换, 4 4 互换, 8 8 互换, 16 16 互换即可,是一种 倒推条件的方法, 对应于原作者的方法。
 
二, 先把两个箭头的位置互换,即 16 16 互换;再将每个箭头分成两份,两组 8 8 互换,依次类推, 4 4 4 互换, 8 2 2 互换, 16 组奇偶互换,实 现方法和思考方法一致。
 
第二种方法更容易想到, 借鉴了二分查找的思想,逐层分半。
 
如果为面试,要是你很快写出上述算法, 一种说明你是天才,另外一种说明你以前做过此题,那么考察就没有意义了,只能说明你准备充分, 不能说明你有多牛 ;当然天才是很少的了,他立刻随便再出个题,如果你也能很快搞定,那可能真说明你是天才,可是这样的概率太小了;咱们还是老实点吧, 肯定不能说咱们做过,又不能说自己是天才,那要想装牛 B 怎么办呢
 
创新的源泉在哪?肯定不是抄袭,做过跟抄袭差不多了, idea 来自于 analogy and imitation ,类比借鉴才是创新的源泉,不能无地拔高楼,但咱们可以借鉴模仿,这才是 体现人学习的能力,才是素质的根本 。对于一个很复杂的算法,我相信 借鉴模仿的理由比证明你是个天才更让人信服 ,因为我不是天才,我只能以此来博取面试官的信任。
 
面试是一种策略,同样的事情,不同的表述方式,可以让面试官产生不同的印象,我相信你在你给面试官一个答案的时候,能更好的阐述你的理由,强调你的学习模仿借鉴能力,我相信面试官会认为你具备创新能力。
 
现在课题时间很紧,可我为什么要抽时间写此文呢?上述第二种方法是我在分析原作者的思路时想到的,也就是借鉴模仿吧, 让我突然觉得,如果每一个算法题目,要是能分析其精髓,举一反三,再来点创新,我相信不用把所有常考的算法都做一遍,我也能够应付,这才是我学习此算法得到的 idear
 
 
以上乃个人愚见,如果大家有其他的算法,欢迎讨论

你可能感兴趣的:(C/C++面试之算法系列--从"反转32 位数"算法题分析面试策略)