LeetCode 第66题:加一

96 阅读3分钟

LeetCode 第66题:加一

题目描述

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

难度

简单

题目链接

点击在LeetCode中查看题目

示例

示例 1:

输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123,加 1 得到 124。

示例 2:

输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321,加 1 得到 4322。

示例 3:

输入:digits = [9] 输出:[1,0] 解释:输入数组表示数字 9,加 1 得到 10。

提示

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9
  • digits 不含前导零

解题思路

从后向前遍历

这道题的关键是处理进位的情况。我们需要从数组末尾开始向前处理,如果遇到9需要进位,直到找到一个不是9的数字或者到达数组开头。

关键点:

  1. 从后向前遍历数组
  2. 处理进位情况
  3. 处理全是9的特殊情况
  4. 注意数组长度可能需要增加

具体步骤:

  1. 从最后一位开始向前遍历
  2. 如果当前位是9,置为0并继续向前
  3. 如果当前位不是9,加1并返回
  4. 如果全部都是9,需要创建新数组

图解思路

算法步骤分析表

步骤操作状态说明
初始输入[1,2,3]原始数组
末位加1计算[1,2,4]无需进位
遇到9进位[1,3,0]需要进位
全是9新建[1,0,0,0]长度增加

状态/情况分析表

情况输入输出说明
无进位[1,2,3][1,2,4]最简单情况
有进位[1,9,9][2,0,0]需要进位
全是9[9,9,9][1,0,0,0]长度增加

代码实现

C# 实现

public class Solution {
    public int[] PlusOne(int[] digits) {
        for (int i = digits.Length - 1; i >= 0; i--) {
            // 如果当前位小于9,直接加1并返回
            if (digits[i] < 9) {
                digits[i]++;
                return digits;
            }
            
            // 当前位是9,置为0,继续循环处理进位
            digits[i] = 0;
        }
        
        // 如果执行到这里,说明所有位都是9
        int[] result = new int[digits.Length + 1];
        result[0] = 1;
        return result;
    }
}

Python 实现

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        # 从后向前遍历
        for i in range(len(digits) - 1, -1, -1):
            # 如果当前位小于9,直接加1并返回
            if digits[i] < 9:
                digits[i] += 1
                return digits
            
            # 当前位是9,置为0,继续循环处理进位
            digits[i] = 0
        
        # 如果执行到这里,说明所有位都是9
        return [1] + [0] * len(digits)

C++ 实现

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        for (int i = digits.size() - 1; i >= 0; i--) {
            // 如果当前位小于9,直接加1并返回
            if (digits[i] < 9) {
                digits[i]++;
                return digits;
            }
            
            // 当前位是9,置为0,继续循环处理进位
            digits[i] = 0;
        }
        
        // 如果执行到这里,说明所有位都是9
        vector<int> result(digits.size() + 1, 0);
        result[0] = 1;
        return result;
    }
};

执行结果

  • 执行用时:152 ms
  • 内存消耗:41.2 MB

代码亮点

  1. 🎯 简洁高效的实现
  2. 💡 巧妙处理进位情况
  3. 🔍 优雅处理全9的特殊情况
  4. 🎨 代码逻辑清晰

常见错误分析

  1. 🚫 没有处理全是9的情况
  2. 🚫 进位处理逻辑错误
  3. 🚫 返回数组长度错误
  4. 🚫 没有考虑数组为空的情况

解法对比

解法时间复杂度空间复杂度优点缺点
转整数O(n)O(1)思路简单可能溢出
字符串O(n)O(n)容易理解效率低
数组遍历O(n)O(1)最优解法需要处理进位

相关题目