27. 移除元素 #
题目地址 #
解题思路 #
暴力法 #
TODO
双指针法 #
可以用双指针/快慢指针来解决。快指针用来寻找新数组的元素,新数组就是不含有目标元素的数组,慢指针用来指向更新新数组下标的位置。这里需要的注意的是,“新数组”其实就是旧数组,因为一直都在在同一个数组上的操作,这也是题目的要求👇
不要使用额外的数组空间,你必须仅使用
O(1)
额外空间并原地修改输入数组。
具体实现 #
package main
import "fmt"
func removeElement(nums []int, val int) int {
length := len(nums)
low := 0
for i := 0; i < length; i++ {
if nums[i] != val {
nums[low] = nums[i]
low++
}
}
return low
}
func main() {
x := []int{1, 2, 6, 7, 9, 6, 6, 6}
xx := removeElement(x, 6)
fmt.Println(x, xx)
}
package main
import "fmt"
func removeElement(nums []int, val int) int {
if len(nums) == 0 {
return 0
}
length := len(nums)
for i := 0; i < length; i++ {
if nums[i] == val { // 发现需要移除的元素,就将数组集体向前移动一位
for j := i + 1; j < length; j++ {
nums[j-1] = nums[j]
}
// 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
// 因为不知道移动过来的第一位的值是不是 val
i--
length-- // 此时数组的大小-1
}
}
return length
}
func main() {
x := []int{1, 2, 6, 7, 9, 6, 6, 6}
xx := removeElement(x, 6)
fmt.Println(x, xx)
}