LeetCode_66. 加一(Java实现)

题目描述:66. 加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

思路描述:

很容易可以发现,数组共有3种形式。
1》最后一位数字不为9,不需要进位。
即:

[1,2,4,5,2,3] = => [1,2,4,5,2,4];
[3,6,9,4 ] = => [3,6,9,5]

我们只需要取出它的最后一位+1后再存入即可。
2》数组中连续后几位为9,但数组不全为9。需要进位。
即:

[1,2,9] = => [1,3,0];
[2,4,9,9,9] = => [2,5,0,0,0];

加1变成10后,将当前元素设为0,前一位+1。循环,直至遇到+1后不为10的,结束循环。
循环条件应加上索引0处不为10,否则出现第三种情况。
3》数组中的元素全为9。即:

[9] = => [1,0];
[9,9,9,9] = => [1,0,0,0,0];

此时,我们需要重新创建一个长度原元数组长度+1的数组,将其用0填充,然后将0索引处的元素设为1;返回数组

class Solution {
    public int[] plusOne(int[] digits) {
        //获取数组长度
        int len=digits.length, j=1;
        //最后一位加一
        digits[len-1]+=1;
        //如果,加一之后成为10,则继续向前加一,直至不为10或数组第一位也为10
        while(digits[len-j]==10&&len-j!=0){
             digits[len-j]=0;
             digits[len-(++j)]+=1;
        }
       
        //如果数组第一位为10,则重新创建数组,将其重置
        if(digits[0]==10){
            int[] result=new int[len+1];
            //用0填充数组(或可默认)
            Arrays.fill(result,0);
            //将首位变为1
            result[0]=1;
            return result; 
        }
        return digits;
    }
}

LeetCode_66. 加一(Java实现)_第1张图片
个人觉得思路很清晰,实现有些许的复杂,还会继续改进。

https://leetcode-cn.com/problems/plus-one/

你可能感兴趣的:(Leetcode,java,数据结构,leetcode)