返回

挑战算法:算法每日一题 015 加一

Android

问题

给定一个非负整数,表示为数字数组 digits,其中每个元素是一个数字。对 digits 执行加一操作,返回更新后的数组。

示例:

输入:digits = [1,2,3]
输出:[1,2,4]

输入:digits = [9]
输出:[1,0]

输入:digits = [9,9,9]
输出:[1,0,0,0]

解题思路

加一操作可以从最低位开始,逐位处理。对于每一位:

  1. 增加 1: 将当前位的值加 1。
  2. 进位处理: 如果加 1 后当前位的值大于 9,则当前位的值设为 0,并将 1 进位到下一位。

代码实现:

Python:

def plusOne(digits):
    n = len(digits)
    # 从最低位开始处理
    for i in range(n-1, -1, -1):
        # 增加 1
        digits[i] += 1
        # 进位处理
        if digits[i] > 9:
            digits[i] = 0
            if i > 0:
                digits[i-1] += 1
            else:
                # 最高位进位,需要在数组前面加 1
                digits.insert(0, 1)
    return digits

C++:

vector<int> plusOne(vector<int>& digits) {
    int n = digits.size();
    // 从最低位开始处理
    for (int i = n - 1; i >= 0; i--) {
        // 增加 1
        digits[i]++;
        // 进位处理
        if (digits[i] > 9) {
            digits[i] = 0;
            if (i > 0) {
                digits[i-1]++;
            } else {
                // 最高位进位,需要在数组前面加 1
                digits.insert(digits.begin(), 1);
            }
        }
    }
    return digits;
}

Java:

public class Solution {
    public int[] plusOne(int[] digits) {
        int n = digits.length;
        // 从最低位开始处理
        for (int i = n - 1; i >= 0; i--) {
            // 增加 1
            digits[i]++;
            // 进位处理
            if (digits[i] > 9) {
                digits[i] = 0;
                if (i > 0) {
                    digits[i-1]++;
                } else {
                    // 最高位进位,需要在数组前面加 1
                    int[] newDigits = new int[n + 1];
                    newDigits[0] = 1;
                    for (int j = 1; j < n + 1; j++) {
                        newDigits[j] = digits[j - 1];
                    }
                    digits = newDigits;
                }
            }
        }
        return digits;
    }
}

总结

加一算法是一种常见的数学操作,可以通过逐位处理、加一和进位处理来解决。在实际应用中,加一算法可以用于处理各种涉及数字操作的问题。