27. 移除元素

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)
}

参考 #