27.移除元素
思路分析
快慢指针:
- 快指针匹配条件
- 慢指针填充数据
自解
go
func removeElement(nums []int, val int) int {
f := 0
s := 0
for {
// 快指针超出数组长度,终止循环
if f > len(nums)-1 {
break
}
// 快指针值不等于val,慢指针值等于快指针值
// 快指针值等于val,忽略数组的值
if nums[f] != val {
nums[s] = nums[f]
s++
}
f++
}
return s
}
他解
go
// 初始化要填入的下标 k=0。
// 从左到右遍历 nums,如果 nums[i]=val,则更新 nums[k]=nums[i],然后把 k 加一。
// 遍历结束,返回 k。
func removeElement(nums []int, val int) int {
k := 0
for _, x := range nums {
if x != val {
nums[k] = x
k++
}
}
return k
}
优点
- 使用range避免了空指针异常
- k是慢指针
- k在返回之前已经自增一次了,实际上已经是非val值的总和了