給定數組 nums,將所有 0 移至末尾,保持非零元素相對順序不變。要求原地操作,最小化操作數。
範例: [0,1,0,3,12] → [1,3,12,0,0]
維護 index 指向第一個 0 的位置(或下一個待放置非零元素的位置),current 遍歷數組:
nums[current] != 0,交換 nums[index] 和 nums[current],index++。current++ 繼續。這樣非零元素依次被移到前面,0 自然被推到後面。即使前面無 0,交換也是自己與自己,無副作用。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for (int index = 0, current = 0; current < nums.size(); ++current) {
if (nums[current] != 0) {
swap(nums[index++], nums[current]);
}
}
}
};
本題為雙指針經典應用,代碼極其簡潔高效。