283.移动零解题记录
最开始的想法是覆盖+补0
func moveZeroes(nums []int) {
// 先将为0的覆盖,再将末尾几位覆盖为0
j := 0 // 指向此时被覆盖位置的指针
for i:=0; i<len(nums); i++ {
if nums[i] != 0 {
if j<i{ // 正确的应该删去这句判断
nums[j] = nums[i]
j++
}
}
}
for j<len(nums){
nums[j] = 0;
j++
}
}
但是这份代码存在问题。我想少几个覆盖次数,j<i带来了缺陷,j=i时就不会赋值非零的数据了,丢失了这些数据!而且 j 只有在赋值后才递增,j 始终 ≤ i。
更优雅的写法双指针交换法,思路是把不是0的数字一直往前交换:
func moveZeroes(nums []int) {
j := 0
for i:=0; i<len(nums); i++ {
if nums[i] != 0 {
nums[j], nums[i] = nums[i], nums[j]
j++
}
}
}