iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0

題號:283. Move Zeroes(移動零)

題目說明

給定一個整數陣列 nums,將所有 0 移到陣列末尾,同時 保持非零元素的相對順序。

  • 必須原地操作,不能額外建立另一個陣列。

範例:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

Input: [0]
Output: [0]

解法思路(雙指標 / in-place)

  1. 使用一個指標 lastNonZeroFoundAt,指向最後一個非零元素應該放的位置。
  2. 遍歷陣列:
    • 如果遇到非零元素,放到 lastNonZeroFoundAt 的位置,並將指標加 1。
  3. 遍歷完成後,將剩下的位置全部填 0。

時間複雜度: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]

  1. 遍歷陣列:

    • i=0, nums[0]=0 → 跳過
    • i=1, nums[1]=1 → 放到 index=0 → nums=[1,1,0,3,12], lastNonZero=1
    • i=2, nums[2]=0 → 跳過
    • i=3, nums[3]=3 → 放到 index=1 → nums=[1,3,0,3,12], lastNonZero=2
    • i=4, nums[4]=12 → 放到 index=2 → nums=[1,3,12,3,12], lastNonZero=3
  2. 填充剩餘的 0:

    • index=3 → nums[3]=0
    • index=4 → nums[4]=0

結果:
nums = [1,3,12,0,0]

Java 與 Python 的差異

Java 需要明確宣告陣列型別和迴圈索引,Python 可以直接用 for i in range(len(nums)),語法更簡潔。
整體思路一樣,都是雙指標 in-place 操作,Python 程式碼更直觀。

心得

這題讓我體會到雙指標技巧的實用性,一個指標負責遍歷元素,另一個指標負責記錄非零元素放置的位置,讓零自然被移到末尾。
不像用額外陣列的方法,這樣可以原地操作節省空間,也練到對陣列索引操作的掌握。
程式不一定要複雜才好,善用簡單的指標和迴圈就能完成高效解法,理解邏輯比追求炫技更重要。


上一篇
day6
下一篇
day8
系列文
不熟程式的我在leetcode打滾30天9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言