面试题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 }
面试题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 }
面试题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 }