终于下定决心写博客了(好久之前就有这个想法了,但是一直不知道要写啥,可能是因为自己水平太弱了吧,虽然说现在还是很弱,但还是决定开始写了),主要是记录一下的自己的学习成长经历,写的内容会比较基础。
一道牛客网收录的2017去哪儿的校招真题(连接:点击打开链接)
这道题总的来说是一道常规题,但是有两个地方如果没有注意到,还是会出错的。
题目要求:
对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
测试样例:
[1,3,5,7,9],5,3
返回:1
直接看代码应该比较清晰
class BinarySearch {
public:
int getPos(vector<int> A, int n, int val) {
// write code here
if (n < 1) return -1;
if (A[0] <= A[n-1]) {
size_t low = 0;
size_t high = n - 1;
while (low <= high) {
size_t mid = (low + high) / 2;
if (val > A[mid]) {
low = mid + 1;
} else if (val < A[mid]) {
high = mid - 1;
} else {
while (mid >= 1 && A[mid] == A[mid - 1]) --mid;
return mid;
}
}
return -1;
} else {
size_t low = 0;
size_t high = n - 1;
while (low <= high) {
size_t mid = (low + high) / 2;
if (val < A[mid]) {
low = mid + 1;
} else if (val > A[mid]) {
high = mid - 1;
} else {
while (mid >= 1 && A[mid] == A[mid - 1]) --mid;
return mid;
}
}
return -1;
}
}
};
这里需要注意的地方有 :
1.题目并没有说明是递增还是递减序列,这就需要在写程序的时候考虑进去。
2.可能存在重复元素,题目要求返回要查找元素在给定序列中第一次出现的位置,没有找到则返回-1
我当时在写这道题的时候这两个地方都考虑到了(当时觉得面试题肯定不会那么平常, 就只考察二分的代码)但是第一次提交的时候还是没有通过
while (mid >= 1 && A[mid] == A[mid - 1]) --mid;
第一次写的时候, 不知怎么的写成了mid > 1 就出错了, 还是因为检查的不够仔细吧!