![](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuL2RpcmVjdC81YTk2ZmM3NmRjNzM0ZGQ5ODkzNDYwM2EzYWIzYTQyMS5wbmc%3D)
// [1,2,3] [1,2,4]
// [4,3,2,1] [4,3,2,2]
// [9] [1,0]
// [3,9] [4,0] 额外加的
// vec反向遍历
pub fn plus_one(digits: Vec<i32>) -> Vec<i32> {
let mut digits = digits; // mut shadow
for i in (0..digits.len()).rev() {
if digits[i] < 9 {// 加一后位数没有变就直接加一返回 加一后位数变了就跳出循环下面insert加上一位
digits[i] += 1;
return digits;
}
digits[i] = 0;
}
digits.insert(0, 1);//位数变了就在索引零插入新的一位
digits
}
// 栈的实现版本 一个接收栈 反向接收目标vec 遍历vec 判断是否需要进位 翻转返回
pub fn plus_one2(digits: Vec<i32>) -> Vec<i32> {
let mut stack = Vec::new(); // 遍历接收digits
let mut carry = 1;// 遍历时变量是否加1的标记
for &digit in digits.iter().rev() {
let sum = digit + carry; // 遍历位 carry为0的时候就是不用继续加1的时候
if sum == 10 { //
stack.push(0);
carry = 1;
} else {
stack.push(sum);
carry = 0;
}
}
if carry == 1 { // 遍历完后carry还是1说明需要进位
stack.push(1);// 进位
}
stack.reverse();// 翻转成原来的顺序
stack
}
fn main() {
assert_eq!(plus_one(vec![1, 2, 3]), vec![1, 2, 4]);
assert_eq!(plus_one(vec![4, 3, 2, 1]), vec![4, 3, 2, 2]);
assert_eq!(plus_one(vec![9]), vec![1, 0]);
assert_eq!(plus_one(vec![3,9]), vec![4, 0]);
assert_eq!(plus_one2(vec![1, 2, 3]), vec![1, 2, 4]);
assert_eq!(plus_one2(vec![4, 3, 2, 1]), vec![4, 3, 2, 2]);
assert_eq!(plus_one2(vec![9]), vec![1, 0]);
assert_eq!(plus_one2(vec![3,9]), vec![4, 0]);
}