You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:42:34