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