剑指Offer

面试题7:用两个栈实现队列

如果需要插入队尾,就压入到stack1,如果需要删除队首,需要判断stack2是否为空,若为空,则将stack1弹出压入stack2,stack2栈顶即为队首

面试题8:旋转数组的最小数字

题目:将一个数组最开始的若干个元素搬到数组的末尾,我们成为数组的旋转,输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4, 5, 1, 2}为{1, 2, 3, 4,5}的一个旋转,该数组的最小值为1

 1 int Min(int* numbers, int length)
 2 {
 3     if (numbers == NULL || length == 0)
 4         return -1;
 5     int index1 = 0;
 6     int index2 = length - 1;
 7     //当该数组本身就是从小到大顺序的数时,第一个数就应该返回,所以初始化indexMid为第一个数
 8     int indexMid = index1;
 9     while (numbers[index1] >= numbers[index2])
10     {
11         //如果相差为一时就找到了
12         if (index1 + 1 == index2)
13         {
14             indexMid = index2;
15             break;
16         }
17         indexMid = (index1 + index2) / 2;
18         //如果三个数相同,并不能确定最小的数在前半部分还是后半部分,所以只能顺序查找
19         if (numbers[index1] == numbers[index2] && numbers[index1] == numbers[indexMid])
20         {
21             return MinInOrder(numbers, index1, index2);
22         }
23         //中间的数大于第一个数时,中间的数属于前面序列
24         if (numbers[index1] <= numbers[indexMid])
25         {
26             index1 = indexMid;
27         }
28         else if (number[index2] >= numbers[indexMid])
29         {
30             //否则就是中间的数小于第二个指针指向的数,这时中间的数属于后半个序列
31             index2 = indexMid;
32         }
33     }
34     return numbers[indexMid];
35 }
36 int MinInOrder(int* numbers, int index1, int index2) 
37 {
38     int result = numbers[index1];
39     for (int i = index1 + 1; i <= index2; i++)
40     {
41         if (result > numbers[i])
42             result = numbers[i];
43     }
44     return result;
45 }
面试题8

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

题目:输入一个数,输出概述二进制表示中1的个数,

1.

 1 //直接判断最右边一位是否为一,然后该数右移一位
 2 //缺点:不能判断负数,例如-1二进制为FFFF右移补符号位
 3 int NumberOf1(int n)
 4 {
 5     int cnt = 0;
 6     while (n)
 7     {
 8         if (n & 1)
 9             cnt++;
10         n >>= 1;
11     }
12     return n;
13 }
14 //找一个数来一位一位的测,每次要左移一位
15 int NumberOf1(int n)
16 {
17     int cnt = 0;
18     unsigned int flag = 1;
19     while (flag)
20     {
21         if (flag & n)
22             cnt++;
23         flag <<= 1;
24     }
25     return cnt;
26 }
27 // 把一个整数减一,都是把最右边的数变成0,如果它右边还有0的话,所有的0都变成1,而他左边所有位都保持不变。
28 //接下来把一个整数和它减去1的结果做位运算,相当于把它最右边的1变成0
29 int NumberOf1(int n)
30 {
31     int cnt = 0;
32     while (n)
33     {
34         cnt++;
35         n = n & (n - 1);
36     }
37     return cnt;
38 }
求二进制中1的个数

 面试题11:数值的整数次方

注意考虑要全面,可以加个快速幂

 1 //各种情况都要考虑清楚
 2 //1底数为0,指数为负数,这种情况下是输入错误
 3 //2底数为0,指数大于等于0,这种情况是0
 4 //3底数不为0,指数小于0,要取倒数
 5 //4底数不为0,指数大于0
 6 bool g_InvalidInput = false;
 7 void Power(double base, int exponent)
 8 {
 9     if (Equal(base, 0))
10     {
11         if (exponent < 0)
12         {
13             g_InvalidInput = true;
14             return 0.0;
15         }
16         else 
17         {
18             return 0.0;
19         }
20     }
21     int absExponent = exponent;
22     if (exponent < 0)
23     {
24         absExponent = -exponent;
25     }
26     double sum = 1.0;
27     for (int i = 1; i <= absExponent; i++)
28     {
29         sum *= base;
30     }
31     if (exponent < 0)
32     {
33         sum = 1.0/sum;
34     }
35     return sum;
36 }
数值的整数次方

 

posted @ 2017-03-06 21:51  zhaop  阅读(158)  评论(0)    收藏  举报