LeetCode PlusOne题C++代码全9输入触发vector越界错误求助
问题描述
在LeetCode平台练习PlusOne题目,题目规则如下:给定一个表示大整数的整数数组digits,其中digits[i]为大整数的第i位数字,数组按最高位到最低位从左到右排列,且大整数不存在前导零;请将该大整数加1,返回运算结果对应的数字数组。例如输入digits = [1,2,3]时,输出为[1,2,4],对应运算123 + 1 = 124。
现有代码可通过绝大多数测试用例,但当输入数组元素全为9时,会触发越界报错,需求是保留原有实现思路的前提下修复问题,跑通所有用例后再做性能优化。
错误信息
全9输入触发的报错信息如下:
terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)
原有C++实现代码:
class Solution { public: vector<int> plusOne(vector<int>& digits) { if(digits.at(digits.size()-1) < 9) { digits.at(digits.size()-1) += 1; } else { int zeroCount = 0; int index = 0; for(int i = digits.size()-1; i >= 0;--i) { if(digits.at(i) == 9) { digits.pop_back(); zeroCount++; } else { index = i; break; } } if(digits.at(index) < 9) { digits.at(index) += 1; for(int i = 0; i < zeroCount; ++i) { digits.push_back(0); } } else { digits.push_back(1); for(int i = 0; i < zeroCount; ++i) { digits.push_back(0); } } } return digits; } };
越界原因定位
- 当输入为全9数组(如
[9,9,9])时,从尾到头遍历的循环会将所有元素判定为9,每匹配一个9就执行一次pop_back(),循环结束后digits长度为0,成为空数组。 - 全9场景下循环不会走到非9的分支,
index始终保持初始值0,后续代码执行digits.at(index)即访问空数组下标为0的位置,直接触发std::out_of_range越界错误。 - 原代码中
digits.at(index) < 9判断对应的else分支是无效逻辑:只要能执行到digits.at(index)这行,说明循环找到了第一个非9的位,该位数值必然小于9,这个分支永远不会被触发,自然也处理不了全9的边界场景。
适配原有思路的修复方案
核心改动仅需增加空数组判断:遍历完尾部连续的9之后,如果数组已经被清空(即所有位都是9的场景),直接走「头部补1,后面补对应数量0」的逻辑,避免访问空数组下标。
修复后的完整代码:
class Solution { public: vector<int> plusOne(vector<int>& digits) { if(digits.at(digits.size()-1) < 9) { digits.at(digits.size()-1) += 1; } else { int zeroCount = 0; int index = 0; for(int i = digits.size()-1; i >= 0;--i) { if(digits.at(i) == 9) { digits.pop_back(); zeroCount++; } else { index = i; break; } } // 全为9的边界场景:数组已被弹空,直接补1加对应数量的0 if(digits.empty()) { digits.push_back(1); for(int i = 0; i < zeroCount; ++i) { digits.push_back(0); } } else { digits.at(index) += 1; for(int i = 0; i < zeroCount; ++i) { digits.push_back(0); } } } return digits; } };
- 改动完全保留原有实现逻辑:尾部非9直接加1;尾部为9则统计连续9的数量、弹出这些9,找到第一个非9的位加1后补回对应数量的0;仅在全9、数组被弹空的场景走单独的补1加0逻辑,不会触发空数组访问。
- 修复后可覆盖所有测试用例,包括全9的边界场景,后续可在此基础上做进一步性能优化。
内容的提问来源于stack exchange,提问作者artichoke
相关产品推荐
相关产品推荐

