題號:283. Move Zeroes(移動零)
題目說明
給定一個整數陣列 nums,將所有 0 移到陣列末尾,同時 保持非零元素的相對順序。
範例:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
Input: [0]
Output: [0]
解法思路(雙指標 / in-place)
時間複雜度:O(n)
空間複雜度:O(1)
程式碼說明
Java 解法
public class Solution {
public void moveZeroes(int[] nums) {
int lastNonZeroFoundAt = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[lastNonZeroFoundAt++] = nums[i];
}
}
for (int i = lastNonZeroFoundAt; i < nums.length; i++) {
nums[i] = 0;
}
}
}
Python 解法
def moveZeroes(nums):
last_non_zero_found_at = 0
for i in range(len(nums)):
if nums[i] != 0:
nums[last_non_zero_found_at] = nums[i]
last_non_zero_found_at += 1
for i in range(last_non_zero_found_at, len(nums)):
nums[i] = 0
Trace 範例
輸入:
nums = [0,1,0,3,12]
遍歷陣列:
填充剩餘的 0:
結果:
nums = [1,3,12,0,0]
Java 與 Python 的差異
Java 需要明確宣告陣列型別和迴圈索引,Python 可以直接用 for i in range(len(nums)),語法更簡潔。
整體思路一樣,都是雙指標 in-place 操作,Python 程式碼更直觀。
心得
這題讓我體會到雙指標技巧的實用性,一個指標負責遍歷元素,另一個指標負責記錄非零元素放置的位置,讓零自然被移到末尾。
不像用額外陣列的方法,這樣可以原地操作節省空間,也練到對陣列索引操作的掌握。
程式不一定要複雜才好,善用簡單的指標和迴圈就能完成高效解法,理解邏輯比追求炫技更重要。