65.加一

题目描述

给定一个表示 大整数 的整数数组 digits,其中 digits[i] 是整数的第 i 位数字。这些数字按从左到右,从最高位到最低位排列。这个大整数不包含任何前导 0。
将大整数加 1,并返回结果的数字数组。

示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
加 1 后得到 123 + 1 = 124。
因此,结果应该是 [1,2,4]。

示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
加 1 后得到 4321 + 1 = 4322。
因此,结果应该是 [4,3,2,2]。

示例 3:
输入:digits = [9]
输出:[1,0]
解释:输入数组表示数字 9。
加 1 得到了 9 + 1 = 10。
因此,结果应该是 [1,0]。

特殊情况

digits = [9,9,9,9]

#include <vector>
using namespace std;

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) 
    {
        int len = digits.size() - 1;
        int flag = len;
        
        // 找到第一个不是9的位置(从后往前)
        while (flag >= 0 && digits[flag] == 9)  // 添加flag >= 0防止越界
        {
            flag--;
        }
        
        if (flag < len)  // 存在9,需要进位
        {
            if (flag == -1)  // 特殊情况:所有数字都是9
            {
                // 原数组所有位都变为0,在开头添加1
                for (int i = 0; i <= len; i++)
                {
                    digits[i] = 0;
                }
                digits.insert(digits.begin(), 1);  // 在开头插入1(正确处理最高位进位)
            }
            else  // 部分数字是9
            {
                digits[flag] += 1;  // 非9位加1
                // 后面的9都变为0
                for (int i = flag + 1; i <= len; i++)
                {
                    digits[i] = 0;
                }
                // 这里移除了错误的push_back(0),避免越界
            }
        }
        else  // 末尾不是9,直接加1
        {
            digits[len] += 1;
        }
        
        return digits;
    }
};

posted @ 2025-08-18 21:16  开心猪扒  阅读(11)  评论(0)    收藏  举报