给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
力扣https://leetcode.cn/problems/move-zeroes/
Rust代码,参考注释:
使用后快慢指针
// 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
// 请注意 ,必须在不复制数组的情况下原地对数组进行操作。
fn main() {
// 声明可变变量
let mut vec : Vec<i32> = vec![0,1,0,3,12];
// 借用vec,所有权不转移
move_zero(&mut vec);
// {:?} ,用于将数据类型实现了Debug特性的数据打印到控制台。
println!("{vec:?}");
}
// 快慢指针:先创建两个指针slow,fast,慢指针slow记录最终的结果,快指针fast用来遍历整个数组,当fast遍历时遇到!0的值时,把fast当前指向的值付给slow,并且slow向后移动一位,当fast遍历完成后,剩余元素全是0,这时就要从slow开始第二次遍历数组,把剩余位置全赋值为0。
// 引用vec变量,方法结束后交还所有权
fn move_zero(vec : &mut Vec<i32>) {
let mut fast = 0;
let mut slow = 0;
while fast < vec.len() {
if vec[fast] != 0 {
vec[slow] = vec[fast];
slow+=1;
}
fast+=1;
}
while slow <vec.len(){
vec[slow] = 0;
slow +=1;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_move() {
let mut v : Vec<i32> = vec![0,1,0,3,12];
move_zero(&mut v);
println!("{:?}", v);
// 判断两个数组相等
assert_eq!(v, [1,3,12,0,0]);
}
}