Rust 加一

文章介绍了一个Rust代码解决方案,用于处理LeetCode的加一问题。给定一个整数表示的非负数数组,代码通过反向遍历数组,处理进位,尤其关注最高位为9的情况,最终返回加一后的数组表示的整数。文章提供了测试用例以验证代码的正确性。
摘要由CSDN通过智能技术生成

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

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

你可以假设除了整数 0 之外,这个整数不会以零开头。

力扣icon-default.png?t=N176https://leetcode.cn/problems/plus-one/Rust代码,参考注释:

fn main() {
    // vec! 宏 创建动态数组, <i32>表示存放int类型的元素
    let v : Vec<i32> = vec![9, 9, 9];

    // 这里把变量v传递给plus_one函数,所有权转移到函数中, 外部不能再使用变量v
    let result : Vec<i32> = plus_one(v);
    // println!("{:?}", v);

    // `Vec<i32>` cannot be formatted with the default formatter
    // {} ,使用display trait来显示正常的字符串。display trait对于数组和向量没有实现。
    // println!("{}" ,result);

    // {:?} ,用于将数据类型实现了Debug特性的数据打印到控制台。
    println!("{:?}", result);
    // println!("{result:?}");
}

// 反向遍历数组,如果末位数字(第0位)不为9,则+1;如果末位数字(第0位)为9,则第0位改为0,同时判断第1位是否为9
fn plus_one(mut vec : Vec<i32>) -> Vec<i32>{
    // mut: mutable可变的,可读可写的
    let mut i = vec.len() -1;

    //进位标记,默认最后一位进位
    let mut bit = 1;

    loop {
        let temp = vec[i];
        if temp < 9 {
            // vec可变,需要加上mut定义
            if bit == 1 {
                vec[i] =  temp + 1;
                复原进位
                bit = 0;
            }
            
            // 返回所有权给函数调用者
            return vec;
        } else {
            //最高位是9,增加数组长度并且后面都是0
            if i == 0{
                // 创建动态数组,初始值都为0,长度为vec.len() +1,中间用分号;
                vec = vec![0; vec.len() +1];
                vec[0] = 1;
                return vec;
            }
            vec[i] =  0;
            //标记进位
            bit = 1;
        }

        //准备遍历下一个元素
        if i > 0 {
            i = i -1;
        } else{
            break;
        }
    }
    vec
}

#[cfg(test)]
mod tests {
    use super::*;
    
    #[test]
    fn test_123() {
        let v : Vec<i32> = vec![1, 2, 3];
        let result : Vec<i32> = plus_one(v);
        println!("{:?}", result);
        // 判断两个数组相等
        assert_eq!(result, [1,2,4]);
    }

    #[test]
    fn test_129() {
        let v : Vec<i32> = vec![1, 2, 9];
        let result : Vec<i32> = plus_one(v);
        println!("{:?}", result);
        assert_eq!(result, [1,3,0]);
    }

    #[test]
    fn test_999() {
        let v : Vec<i32> = vec![9, 9, 9];
        let result : Vec<i32> = plus_one(v);
        println!("{:?}", result);
        assert_eq!(result, [1,0,0,0]);
    }
}

参考:GitHub - inrust/Rust-Programming-in-Action: 《Rust编程:入门、实战与进阶》源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值