題目
給定一個數組 nums
,編寫一個函數將所有 0
移動到數組的末尾,同時保持非零元素的相對順序。
來源:
https://leetcode-cn.com/problems/move-zeroes/
示例:
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:
- 必須在原數組上操作,不能拷貝額外的數組。
- 儘量減少操作次數。
解答
方法一:
思路如下
- 發現一個0, 把後邊的元素依次往前移動,
- 最後一個元素賦值爲0
- 每次發現一個0的時候,後邊往前移動的元素個數減一,因爲最後的都是0,沒必要移動了
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int count = 0;
for (int i = 0; i < nums.size() - count;) {
if (nums[i] == 0) {
for (int j = i; j < nums.size() - 1 - count; ++j) {
nums[j] = nums[j + 1];
}
nums[nums.size() - 1 - count] = 0;//移動的最後一個元素
count++;
} else {
i++;
}
}
}
};
方法二:
思路如下:
- 交換0和非0的元素
- 如果0後邊不是0 直接交換就行,然後繼續往前走
- 如果0後邊還是0 那就繼續找不是0的交換
所以就變成了發現0的時候尋找後邊第一個不是0的元素並且進行交換的操作了。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for (int i = 0 ; i < nums.size();) {
//找到不是0, 只要發現一個0 就找往後找第一個不是0的
if (nums[i] == 0) {
int left = i;
//往後找第一個不是0的數據
while(true) {
++i;
if (i == nums.size()) {
return;
}
if (nums[i] != 0) {
break;
}
}
//交換
std::swap(nums[left], nums[i]);
//繼續從原來的地方往前循環
i = left + 1;
} else {
++i;
}
}
}
};