66-加一(PlusOne)

大家好,我是anonymousC,一个算法小白0.0。

题目描述

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

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

你可以假设除了整数 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/plus-one

问题总结

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

问题分析

情况一:无进位(即最后一位小于9)
	如:[1,2,3,8] ==> [1,2,3,9]
	这种情况直接将最后一位加一就好了。
情况二:有进位
	i. 第一位不进位(即最有一位(或其他位置都为9)是9,但第一位小于9)
		如:[6,7,8,9] ==> [6,7,9,0]
		    [6,9,9,9] ==> [7,0,0,0]
	ii. 所有位都进位(即所有位置都为9)
		此时要扩大数组的大小(数字大小要加一)
		如:[9,9,9,9] ==> [1,0,0,0,0]

思路总结

我们可以从最后一位先开始进行加一,再判断是否有进位,若无进位则可以直接返回这个数组,若有进位,我们将该位值改为0,重复以上步骤。

步骤如下:

1.从最后一位先开始进行加一
2.判断是否有进位
3.若无进位则可以直接返回这个数组
4.若有进位,我们将该位值改为0,再重复以上步骤,直到最后依然没有返回数组,说明所有位置都发生了进位,即我们需要对数组长度进行加1,并且将数组的第一个值设置为1

JAVA代码

class Solution {
    public int[] plusOne(int[] digits) {
    // 从最后开始遍历
        for (int i = digits.length - 1; i >= 0; i--){
            digits[i]++; // 进行数字 + 1
            digits[i] %= 10; // 若有进位,则除10取余为0
            if (digits[i] != 0) { // 判断是否有进位
                return digits;  // 若没有进位,则返回
            }  
        }
        // 若for里面没有返回,则说明都发生了进位
        digits = new int[digits.length + 1]; // 数组长度加一
        digits[0] = 1;  // 将第一位赋值为1
        return digits;  // 返回数组
    }
}

LeetCode通过情况

66-加一(PlusOne)

复杂度

时间复杂度: O(n) n为数组的长度

空间复杂度: O(1)

代码优化

欢迎大家给我提供更好的思路,可以给我评论or私信我,感谢您们,感谢您们的支持!

上一篇:Linux(centos)部署tomcat


下一篇:【DB笔试面试66】在Oracle中,关于锁,下列描述不正确的是()