字节跳动面试题分享002

161 阅读1分钟

字节面试题分享

本题是 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条件,退出循环, 输出结果.