题目:在整型数中只有1位是1,求1在整型数中的位置?

 

通常,面试者给的答案是一位一位的右移,并判断是否移位后的值是1,如果是1,输出被移位的位数就是我们要的答案了。

 

但是这并不是最优的答案,时间复杂度是O(n)。那么更好的算法是什么样的呢,其实我们可以采用二分法更高效的解决本问题,时间复杂度是O(logn)。

 

下面给出代码,并测试时间消耗。

 

算法1

 1 int scan(unsigned int value)
 2 {
 3     int len = sizeof (unsigned int) * 8;
 4     for (int i = 0; i < len; i++)
 5     {
 6         if (value == 1)
 7         {
 8             return i;
 9         }
10         value >>= 1;
11     }
12     return -1;
13 }
View Code

算法2

 1 int bi_search(unsigned int value)
 2 {
 3     int len = sizeof (unsigned int) * 8;
 4     len >>= 1;
 5     int pos = 0;
 6     while (value > 0)
 7     {
 8         if (value >> len > 0)
 9         {
10             pos += len;
11             value >>= len;
12         }
13         if (value == 1)
14         {
15            return pos;
16         }
17         len >>= 1;
18     }
19 
20     return -1;
21 }
View Code

 

时间测试结果:

可以看出算法1比算法2多了49.85%的时间开销。

 

本题目测试的是面试者是否能灵活的运用常用的基本算法,也出自于本人实际工作中。