算法:大数加1

大数加1

题目描述

给定一个表示 大整数 的整数数组 digits,其中 digitsi 是整数的第 i 位数字。这些数字按从左到右,从最高位到最低位排列。这个大整数不包含任何前导 0。

将大整数加 1,并返回结果的数字数组。

示例

bash 复制代码
示例 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。

算法实现

使用java实现的算法如下:

java 复制代码
public int[] plusOne(int[] digits) {
        int index = digits.length - 1;
        while (index >= 0) {
            int sum = digits[index] + 1;
            if (sum != 10) {//说明不满足进1,则退出循环
                digits[index] =sum;
                break;
            }

            //如果==10 满足进1,则设置为0
            digits[index] = 0;
            
            if (index - 1 < 0) {//判断数组是否越界
                break;
            }
            int preIndex = index-1;//计算前一个数目
            digits[preIndex] += 1;//上一个+1,这个+1是进位导致
            if (digits[preIndex] != 10) {//说明不满足进1,则退出循环
                break;
            }
            //满足进1,则设置为0
            digits[preIndex] = 0;
            
            //计算preIndex的上一位
            index-=2;//注意是-2,不是-1
        } // end while

        if (digits[0] == 0) {//说明原数组全部元素是9
            int[] result = new int[digits.length + 1];
            result[0] = 1;
            return result;
        }

        return digits;
    }