解法1:双指针
左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。
右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移
关键点:
- 左指针左边均为非零数
- 右指针左边至左指针之间均为零
func moveZeroes(nums []int) {
// 左,右指针
left, right := 0, 0
for right < len(nums){
if nums[right] != 0 {
nums[left], nums[right] = nums[right], nums[left]
left++
}
right++
}
}
解法2:删除0
先移除所有 0,然后把最后的元素都置为 0,就相当于移动 0 的效果。
func moveZeroes(nums []int) {
// 移除0后的数组长度
subArrayLen := removeZero(nums)
for i:= subArrayLen; i<len(nums); i++{
nums[subArrayLen] = 0
}
}
func removeZero(nums []int) int{
fast, slow := 0, 0
for fast < len(nums){
if nums[fast] != 0{
nums[slow], nums[fast] = nums[fast], nums[slow]
slow++
}
fast++
}
return slow
}
扩展:移除元素
解法一:双指针
func removeElement(nums []int, val int) int {
left, right := 0, 0
for right < len(nums){
if nums[right] != val{
nums[left], nums[right] = nums[right], nums[left]
left++
}
right++
}
// nums[0...left-1]存放不等于val的元素
// 最后一次移动后,left指向第一个等于val的元素
return left
}