Bootstrap

leetcode简单题12 加一 rust描述

// [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]);
}

;