2024-06-23 03:05:16 +00:00
|
|
|
|
// 解題影片 https://www.youtube.com/watch?v=98uu0FYPiU8&list=PL-qDGN2q6cbClYCRpJ2pyrlhYK9VjZmL3&index=2
|
|
|
|
|
// leetcode https://leetcode.com/problems/remove-element/
|
|
|
|
|
|
2024-06-23 02:47:15 +00:00
|
|
|
|
fn main() {
|
|
|
|
|
// 可變陣列要這樣用 rust
|
2024-06-23 03:05:16 +00:00
|
|
|
|
let mut case_a: Vec<i32> = vec![3, 2, 2, 3];
|
2024-06-23 02:47:15 +00:00
|
|
|
|
// 傳入時也要帖別聲明 &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
|