文章目录
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,例如 [1,2,3],那么我们直接将末尾的数加一,得到 [1,2,4] 并返回。
- 末尾有若干个 9 ,例如 [1,2,3,9,9],那么我们只需要逆向找出第一个不为 9 的元素,即 3,将该元素加一,同时途中的 9 都变为0,得到 [1,2,4,0,0] 并返回。
- 所有元素都是 9,例如 [9,9,9,9,9],那么答案为 [1,0,0,0,0,0]。我们只需要构造一个长度比参数长度多 1 的新数组,将首元素置为 1,其余元素置为 0 即可。
- 所以这道题可以这样处理,从数组末位逆向查找第一个不是 9 的数字,加一,途中是 9 的位都变成0,进位。
- 如果所有的数字都是 9,那么直接申请新的空间,比源数组长度加一,然后首位赋值为1即可。
题解:
rust:
rust
impl Solution {
pub fn plus_one(mut digits: Vec<i32>) -> Vec<i32> {
let n = digits.len();
for i in (0..n).rev() {
if digits[i] == 9 {
// 进位变为0
digits[i] = 0;
} else {
// 第一个不是9的位
digits[i] += 1;
return digits;
}
}
// digits 中所有的元素均为 9
let mut ans = vec![0; n + 1];
ans[0] = 1;
return ans;
}
}
go:
go
func plusOne(digits []int) []int {
n := len(digits)
for i := n - 1; i >= 0; i-- {
if digits[i] == 9 {
// 进位变为0
digits[i] = 0
} else {
// 第一个不是9的位
digits[i]++
return digits
}
}
// digits 中所有的元素均为 9
digits = make([]int, n+1)
digits[0] = 1
return digits
}
c++:
cpp
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
const int n = digits.size();
for (int i = n - 1; i >= 0; --i) {
if (digits[i] == 9) {
// 进位变为0
digits[i] = 0;
} else {
// 第一个不是9的位
++digits[i];
return digits;
}
}
// digits 中所有的元素均为 9
vector<int> ans(n + 1);
ans[0] = 1;
return ans;
}
};
python:
python
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
n = len(digits)
for i in range(n - 1, -1, -1):
if digits[i] == 9:
# 进位变为0
digits[i] = 0
else:
# 第一个不是9的位
digits[i] += 1
return digits
# digits 中所有的元素均为 9
return [1] + [0] * n
java:
java
class Solution {
public int[] plusOne(int[] digits) {
final int n = digits.length;
for (int i = n - 1; i >= 0; --i) {
if (digits[i] == 9) {
// 进位变为0
digits[i] = 0;
} else {
// 第一个不是9的位
++digits[i];
return digits;
}
}
// digits 中所有的元素均为 9
int[] ans = new int[n + 1];
ans[0] = 1;
return ans;
}
}
非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】三连走一波~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~