leetcode-rust/array/fase_slwo_pointer_27/src/main.rs

49 lines
1.6 KiB
Rust
Raw Normal View History

2024-06-23 02:47:15 +00:00
fn main() {
// 可變陣列要這樣用 rust
let mut case_a: Vec<i32> = vec![3,2,2,3];
// 傳入時也要帖別聲明 &mut -> &mut case_a
let result = remove_element(&mut case_a, 3);
println!("Result: {}", result);
}
// 移除元素,返回刪除後陣列長度,快慢指針,這樣做不需要移動將後面連續的空間每一個都移動 O(n) 解法
// 1. 先想停止條件
// 2. 想邊界值
pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {
let mut slow_pointer: usize = 0; // -> vec 長度從零開始
let mut fast_pointer: usize = 0;
let stop = nums.len();
// 先想停止條件
while fast_pointer < stop {
if nums[fast_pointer] != val {
// 更新陣列中資料
nums[slow_pointer] = nums[fast_pointer];
slow_pointer = slow_pointer + 1;
}
fast_pointer = fast_pointer + 1;
}
return slow_pointer as i32;
}
// 口 口 口 口
// 3,2,2,3
// val = 3
// ===============
// f = 0 -> 第一個是我們不要的,所以慢指針不移動,數組不更新,快指針繼續移動
// 3 口 口 口
// s
// ===============
// f = 1 -> 是我們要的1. 更新慢指針的位置元素為目前走訪到的元素 2. 更新慢指針位置,表示我們陣列已經更新到哪裡了,
// 3 2 口 口 ---> 2 2 口 口
// s ---> s
// ===============
// f = 2 -> 重複步驟
// 2 2 口 口 ---> 2 2 2 口
// s ---> s
// ===============
// f = 2 -> 重複步驟
// 2 2 2 3 ---> 2 2 2 3
// s ---> s