美容行业培训网站建设东莞百度seo排名
最开始的想法是覆盖+补0
func moveZeroes(nums []int) {// 先将为0的覆盖,再将末尾几位覆盖为0j := 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 := 0for i:=0; i<len(nums); i++ {if nums[i] != 0 {nums[j], nums[i] = nums[i], nums[j]j++}}
}