下面代码实现了二分查找算法,在数组 arr 找到目标元素 target 的位置,则横线上能填写的最佳代码是( )。
int binarySearch(int arr[], int left, int right, int target) {
while (left <= right) {
_________________________ // 在此处填入代码
if (arr[mid] == target)
return mid;
else if (arr[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}根据上下文和C++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。
填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。
【考点】二分查找|整数溢出|取中点
1. 考纲定位 GESP 五级《算法基础》模块,二分查找核心考点。命题人专盯溢出漏洞——看似简单的取中点,实则考验对整数运算边界的敏感度。
2. 解题思维 二分查找每次将区间折半,关键在计算中点 mid。若数组跨度极大(如 left=2^30, right=2^30+2),直接相加 left+right 会溢出,导致 mid 错误甚至程序崩溃。选项 A 用 left + (right - left) / 2 先做减法,保证中间值在安全范围;选项 B/D 只是复制左/右边界,完全破坏二分逻辑;选项 C 虽形式正确,却忽略溢出风险,是命题人埋下的"看似正确实则致命"的陷阱。
3. 陷阱拆解 B、D 选项模拟"无脑照抄"思维——考生只看到 mid 需要初始化,就顺手把 left 或 right 赋过去,结果区间不变,算法变成原地死循环。C 选项利用"取整除"的直觉,让粗心者误以为 (left+right)/2 永远正确,却忘了 C++ 中整数相加会先进行,溢出前兆被忽略。A 才是真正安全的写法,体现了"先减后除"的溢出防护策略。
4. 反命题思维 若题目改为"查找负数"或"数组下标从 1 开始",溢出问题会更隐蔽;若选项 A 改成 mid = left + (right - left) >> 1,考察位运算优化。刷到类似题,先问自己:"这道题在考算法流程,还是在考数据边界?"