给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
力扣https://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编程:入门、实战与进阶》源码