标签:
题目:在整型数中只有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 }
算法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 }
时间测试结果:
可以看出算法1比算法2多了49.85%的时间开销。
本题目测试的是面试者是否能灵活的运用常用的基本算法,也出自于本人实际工作中。
标签:
原文地址:http://www.cnblogs.com/joluo/p/4486513.html