【LeetCode】66. 加一

66 阅读1分钟

官方解法挺妙的

题目链接

image.png

image.png

Python3

直觉解法

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        carry = 0
        for i in range(len(digits)-1, -1, -1):
            if i == len(digits) - 1:
                if digits[i] + 1 >= 10:
                    digits[i] = (digits[i] + 1)  % 10
                    carry = 1
                else:
                    digits[i] = digits[i] + 1
                    return digits
            else: 
                if digits[i] + carry >= 10:
                    digits[i] = (digits[i] + carry)  % 10
                    carry = 1
                else:
                    digits[i] = digits[i] + carry
                    return digits

            if i == 0 and carry == 1:
                return [1] + digits

⭐ 官方解法: 从后往前,碰到 9 了才需要处理,否则直接 加 1 返回即可

image.png

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        n = len(digits)
        for i in range(n-1, -1, -1):
            if digits[i] != 9: # 从后往前第一个 不为 9 的 +1, 且 之后的都置0
                digits[i] += 1
                for j in range(i+1, n):
                    digits[j] = 0
                return digits 

        return [1] + [0] * n

image.png

C++

⭐ 官方解法: 从后往前 找第一个不为 9 的数 + 1, 同时将该数 之后的 位置都置 0

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int n = digits.size();
        for (int i = n-1; i > -1; --i){
            if (digits[i] != 9){
                digits[i] += 1;
                for (int j = i+1; j < n; ++j){
                    digits[j] = 0;
                }
                return digits;
            }         
        }
        vector<int> res(n+1);
        res[0] = 1;
        return res;
    }
};