加一
...大约 2 分钟
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
解题思路
根据题目要求可知,加一的情况可分为两种:
- 除了数字9之外的数字加一
- 数字9加一
9之外的数字加一只需要在末尾加一即可;9加一之后,本位变为0,左边一位要加一.
所以只需要判断是否需要进位并且要把进位过程模拟出来即可。
注意:还有一些特殊情况,如99,999等需要一直进位,我们最后还需要手动进位(99-->100、999-->1000),也就是总体位数比原来要多一。
解题代码
func SumAnd1(n []int) []int {
//这里我们从后往前计算
for i := len(n) - 1; i >= 0; i-- {
n[i]++
//如果当前位等于10,则进位,并且当前位变为0
if n[i] == 10 {
n[i] = 0
} else {
//如果当前位不等于10,则直接返回
return n
}
}
//如果循环结束,则说明所有位都等于10,则需要进位,并且当前位变为0
n = make([]int, len(n)+1)
n[0] = 1
return n
}
复杂度分析
时间复杂度:O(n),其中 n 是数组 digits 的长度。
空间复杂度:O(1)O(1)O(1)。返回值不计入空间复杂度。