Algorithem_MoveZeros#
給定一個整數數組 nums,將所有 0 移到它的末尾,同時保持非零元素的相對順序。
請注意,您必須在原地完成此操作,而不必複製數組。
範例 1:
輸入: nums = [0,1,0,3,12]
輸出: [1,3,12,0,0]
範例 2:
輸入: nums = [0]
輸出: [0]
解法一#
實現邏輯:
首先把所有非 0 元素放到前面,並記錄長度,最後從非 0 長度到數組尾部元素置為 0
舉例如下:
nums = [1, 0, 2, 3, 0, 6]
j = 0
遍歷數組:
i = 0,nums[0] = 1, != 0, num[j] = num[i], j + 1, [1, 0, 2, 3, 0, 6]
i = 1, nums[1] = 0,
i = 2, nums[2] = 2, != 0, num[j] = num[i], j + 1, [1, 2, 2, 3, 0, 6]
i = 3, nums[3] = 3, != 0, num[j] = num[i], j + 1, [1, 2, 3, 3, 0, 6]
i = 4, nums[4] = 0,
i = 5, nums[5] = 6, != 0, num[j] = num[i], j + 1, [1, 2, 3, 6, 0, 6]
// 從 j 開始到數組末尾的元素置為0
j = 4, [1, 2, 3, 6, 0, 0]
程式碼如下:
class Solution {
func moveZeroes(_ nums: inout [Int]) {
// 首先把所有非0的取出
var j = 0
for i in 0..<nums.count {
if nums[i] != 0 {
// 當前元素不為0
// j從0開始
nums[j] = nums[i]
j = j + 1
}
}
// 從 j 開始到數組末尾的元素置為0
while j < nums.count {
nums[j] = 0
j = j + 1
}
}
}
解法二#
實現邏輯:
定義一個變量代表數組中 0 的個數,遍歷數組,如果當前元素是 0,則變量加 1,如果當前元素不為 0 且變量長度大於 0,則交換當前元素和前面變量個元素的位置。
舉例如下:
nums = [1, 0, 2, 3, 0, 6]
snowballSize = 0
遍歷數組:
i = 0,nums[0] = 1, snowballSize = 0;
i = 1, nums[1] = 0, snowballSize += 1;
i = 2, nums[2] = 2, snowballSize > 0, swap(i, i - snowballSize), [1, 2, 0, 3, 0, 6]
i = 3, nums[3] = 3, snowballSize > 0, swap(i, i - snowballSize), [1, 2, 3, 0, 0, 6]
i = 4, nums[4] = 0, snowballSize += 1;
i = 5, nums[5] = 6, snowballSize > 0, swap(i, i - snowballSize), [1, 2, 3, 6, 0, 0]
程式碼如下:
class Solution {
func moveZeroes(_ nums: inout [Int]) {
// 定義含0的長度
var snowballSize = 0
// 遍歷數組
for index in 0..<nums.count {
let num = nums[index]
// 如果當前元素為0,則含0長度字段加1
if num == 0 {
snowballSize += 1
}
else if snowballSize >= 1 {
// 如果當前含0字段長度大於1,則交換當前元素和前一個元素的位置
nums.swapAt(index, index-snowballSize)
}
}
}
}