GESP 五级 · GESP 202503 C++ 五级 第 12 题

选择题 · 答案 A · 考点:二分查找

← 整套速查表 GESP 五级 全部真题

题目

下面代码实现了二分查找算法,在数组 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;
}
答案:A

考点

二分查找 讲解 →二分查找 真题汇总 →

解题思维

根据上下文和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,考察位运算优化。刷到类似题,先问自己:"这道题在考算法流程,还是在考数据边界?"

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断