// 解題影片 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 = 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, 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