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

相关文章: