给定一个由非负整数组成的数组 digits,表示一个非负整数的各位数字,其中最高位在数组首位,且 digits 不含前导 0(除非是 0 本身)。下面代码对该整数执行 +1 操作,并返回结果数组,则横线上应填写( )。
vector<int> plusOne(vector<int>& digits) {
for (int i = (int)digits.size() - 1; i >= 0; --i) {
if (digits[i] < 9) {
digits[i] += 1;
return digits;
}
_____________ // 在此处填入代码
}
digits.insert(digits.begin(), 1);
return digits;
}根据上下文和C++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。
填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。
【考点】进位处理|数组操作|模拟
🎯 考纲定位 本题出自 GESP 五级"算法与数据结构"模块中数据处理与模拟类题目。命题人专门挑选这个"全 9 进位"的特殊场景,卡住的是考生对进位传播机制的理解——很多人只看到最后要插 1,却忘了循环里每个 9 必须先变成 0,否则逻辑链直接断裂。
🧠 解题思维 看到题先想:加 1 操作从个位开始,遇到小于 9 的位直接 +1 返回;遇到 9 就进位——当前位归零,向高位继续进。关键观察是循环倒序遍历的语义:i 每次 −1 就是向高一位移动,循环没返回说明所有位都是 9,才走到最后的 insert(begin,1)。因此横线处必须做三件事:当前位清零、让循环继续、保持数组有效性。
🪤 陷阱拆解
digits[i]=9:命题人利用"9 进位后还是 9"的视觉错觉。若填 B,循环永远不返回,最后强行插 1 得到错误结果(如 99→199 而非 100)。digits[i]=1:偷换进位概念,把 9+1 的结果误当 1。更致命的是,这会让循环提前返回(遇到 1 就 +1 直接走),导致 99+1 变成 91。digits[i]=10:违反题目约束"非负整数各位数字",10 不是单个数字,数组越界且语义错误。i >= 0,不是 i > 0。若填 B 或 C 且误以为高位要单独处理,就会漏掉最高位的进位(如 199+1 应得 200,却算成 100)。🔄 反命题思维 如果把循环条件改成 i > 0,最高位是 9 时进位会被完全忽略,999+1 会变成 199,这就是命题人埋的伏笔。刷到类似题先问:当前位归零后,循环会不会继续?最高位进位有没有被覆盖? 答案变,陷阱就现形。