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

选择题 · 答案 D

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

题目

以下代码的功能是将数组中的奇数和偶数分别放在数组的前半部分和后半部分,横线处应该填入的是( )

#include <iostream>
using namespace std;

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int left = 0, right = 4;
    while (left < right) {
        while (arr[left] % 2 == 1 && left < right) left++;
        _______________________
        if (left < right) {
            swap(arr[left], arr[right]);
        }
    }
    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}
答案:D

解题思维

答案D。位运算代码补全要注意区分位运算符(&|^)和逻辑运算符(&&||)。异或(^)常用于交换值。

常见错误

位运算代码补全容易出错,因为位运算结果不如算术运算直观。记住异或的自反性。

详细解析(节选)

【考点】指针移动|奇偶判断|while循环条件

1. 🎯 考纲定位(考点定位) GESP三级"循环与条件"模块,命题人用"左右指针向中间收缩"的框架,卡住考生对while循环边界条件的敏感度——很多孩子只会写"arr[left]%2==1",却忽略left<right的终止保护,导致死循环或越界。

2. 🧠 解题思维(拆解与通法) 整体是"奇数放左、偶数放右"。left向右找第一个偶数,right向左找第一个奇数,相遇即停。横线处必须让right向左缩进,直到遇到奇数或left/right碰头。因此条件里:要判断arr[right]是偶数(%2==0)才继续右移;必须保留left<right,防止指针交叉后继续移动。填入while (arr[right] % 2 == 0 && left < right) right--;即可。

3. 🪤 陷阱拆解(命题人的套路) A:while (arr[left] % 2 == 0 && left < right) right--; 把左指针的判断错用到右指针,逻辑完全反了。B:left-- 会让left从0往负数跑,直接越界,是典型的"指针移动方向"陷阱。C:arr[right] % 2 != 0 时继续右移,会跳过所有奇数,把奇数留在右边,破坏"奇数在前"的要求。D:唯一同时满足"右指针遇到偶数才左移"和"left<right保护"的写法,命题人把"左移条件"和"右移条件"混在一起,让你误以为只要判断right的奇偶就行——其实必须用%2==0,否则方向反了。

4. 🔄 反命题思维(教练升华) 如果改成"偶数在前、奇数在后",只需把判断条件里的%2==0换成%2==1,其他结构不变。刷到类似题先问自己:当前指针的方向、判断的是奇数还是偶数、left<right是否被保留,三者必须自洽。

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