66.加一

题目:
给定一个表示 大整数 的整数数组 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]。

提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
digits 不包含任何前导 0。

本来的思路是:把数组提取成整数→加一→转回数组。可是此思路理论上可行,但在实际的编程中也许不适用。若输入的数组非常非常非常长,转为整数导出则会出现整数溢出问题(尽管python的整数没有上限,但如果超过100万个也会超过python的字符串处理上限,并且用C++/java也必定会溢出)。

这道题考察的是对进位逻辑的掌握,不太好用转整数法依赖语言特性和硬件的极限(远离题目初衷),最好用逐位处理法。

#include <iostream>
#include<vector>
using namespace std;

vector<int> plusOne(vector<int>& digits) {
    for (int i = digits.size() - 1; i >= 0; i--) {
        if (digits[i] < 9) {
            digits[i]++;
            return digits; // 无进位直接返回
        }
        digits[i] = 0; // 处理进位
    }
    digits.insert(digits.begin(), 1); // 最高位进位(如 999 → 1000)
    return digits;
}

涉及知识点:
1.C++的vector是一种序列容器,是基于数组的数据结构,允许你在运行时动态地插入和删除元素。std::vector本质上就是一个动态数组。
2.insert/begin都是vector类的成员函数,begin()用于获取指向容器第一个元素的迭代器;insert()用于在指定位置插入一个或多个元素。
3.plusOne的参数带取地址符是因为要原地修改digits。

posted @ 2025-07-22 11:09  用户snkslakdf  阅读(9)  评论(0)    收藏  举报