我的解法:
我这里用的是最笨的暴力穷举法,一个一个判断,然后删除重复的元素
func removeDuplicates(nums []int) int {
for i := 0; i < len(nums); i++ {
if indexArray(nums[i], nums) {
// 这里说明存在重复,我们把所有的数据都往前移
for j := i; j < len(nums)-1; j++ {
nums[j] = nums[j+1]
}
nums = nums[:len(nums)-1]
i--
}
}
return len(nums)
}
// 判断array是否在数组中重复
func indexArray(i int, nums []int) bool {
var count int = 0
for _, v := range nums {
if v == i {
count++
if count > 1 {
return true
}
}
}
return false
}
双指针法:
看到官方解法的一瞬间,我就发现我好蠢,这个数组其实是一个有序数组,所以重复的内容一定会出现在一起,这就是双指针可以执行的原因。
官方的双指针法其实就是通过两个指针,一个指针用来计数一个用来判断重复度
func removeDuplicates(nums []int) int {
// 如果长度为0,直接退出
if len(nums) == 0 {
return 0
}
i := 0
// 这里我们遍历数组
for j := 1; j < len(nums); j++ {
// 这里就是关键部分,如果发现数字重复,我们就不管,如果不重复那么就i+1
// 然后我们这里替换一下用于替换重复项
if nums[i] != nums[j] {
i++
nums[i] = nums[j]
}
}
return i + 1
}
func main() {
log.Println(removeDuplicates([]int{0, 0, 1, 1, 1, 2, 2, 3, 3, 4}))
}