字节面试题分享
本题是 2018校招后端方向(第二批)第四题
题目::以下函数使用二分查找搜索一个增序的数组,当有多个元素值与目标元素相等时,返回最后一个元素的下标,目标元素不存在时返回-1。请指出程序代码中错误或不符最佳实践的地方(问题不止一处,请尽量找出所有你认为有问题的地方)[找问题]
简单来说就是给你一个数组,让你查找其中一个数,返回这个数的下标
需要注意:当有多个元素值与目标元素相等时,返回最后一个元素的下标
如:[1,2,2,2,3,4] 让你返回2的下标 ,输出3 题干代码:
int BinarySearchMax(const std::vector<int>& data, int target)
{
int left = 0;
int right = data.size();
while (left < right) {
int mid = (left + right) / 2;
if (data[mid] <= target)
left = mid + 1;
else
right = mid - 1;
}
if (data[right] == target)
return right;
return -1;
}
应该修改的地方:
1. int right = data.size(); 应该改为 int right = data.size() - 1;
2. while (left < right) 应该改为 while (left <= right)
3. int mid = (left + right) / 2; 应该改为 int mid = left + (right - left + 1) / 2
解释::1和2修改因为此数组可能有重复的元素所以while循环应该加上等于号 ,3这么做是为了防止溢出
有些人可能觉得当data[mid]<=targht的时候应该是left = mid 因为如果left = mid + 1就把目标值跳过了, 但xdm想一想,此时虽然可能跳过,但是下一次循环right就会回到目标值,然后不符合while条件,退出循环, 输出结果.