52 lines
1.7 KiB
Rust
52 lines
1.7 KiB
Rust
// 解題影片 https://www.youtube.com/watch?v=98uu0FYPiU8&list=PL-qDGN2q6cbClYCRpJ2pyrlhYK9VjZmL3&index=2
|
||
// leetcode https://leetcode.com/problems/remove-element/
|
||
|
||
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
|