作者:看那个码农
公众号:看那个码农
上期内容介绍了Go语言学习之:=与=的区别|Go主题月
- :=与=的区别
本篇内容将继续带领大家走进Go语言的世界。
1.本文简介
Go语言学习之力扣-删除有序数组中的重复项II
来源于:Leetcode80. 删除有序数组中的重复项 II
2.题目描述
给你一个有序数组nums
,请你原地删除重复出现的元素,使每个元素最多出现两次,
返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)
额外空间的条件下完成。
示例
输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5,
并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
不需要考虑数组中超出新长度后面的元素。
提示:
- 0 <= nums.length <= 3 *
- - <= nums[i] <=
- nums 已按升序排列
3.思路与方法
由题意最后只用输出新数组的长度
- 我们可以利用遍历,设定两个开始节点;
- 从数组第一个元素进行遍历,依次对比元素是否相同,将符合题目要求的元素往前移动;
- 最后输出数组元素不同的那部分长度即可。
例如我们用一个例子来直观地说明:
1.初始数组num=[1,2,2,2]
2.设定两个起点进行遍历数组,因为题目要求使每个元素最多出现两次,所以此时我们设置节点的起始值
node=1,j=2,
,即为num[node]=1,num[j]=2,
3.如果num[i]!=num[node-1]
,通过node++
,使得node++
的值等于此时i
的值。
使得num[node]=num[i]
利用这样的方式,将同一个数组的符合要求的元素都往前移动。
最后输出节点node+1
的长度即可
4.代码实现如下
func removeDuplicates(nums []int) int {
node:=1
for j :=2;j<len(nums);j++{
if nums[j]!=nums[node-1]{
node++
nums[node]=nums[j]
}
}
return node+1
}
输出为:
5.规律总结
我们由这道题浮想一下,如果题目继续改为:
给你一个有序数组 nums
,请你原地删除重复出现的元素,使每个元素最多出现n
次 ,
返回删除后数组的新长度。
如果n=3
,使每个元素最多出现n
次,我们的代码可以修改为:
package main
import (
"fmt"
)
func removeDuplicates(nums [6]int) int {
node:=2
for j :=3;j<len(nums);j++{
if nums[j]!=nums[node-2]{
node++
nums[node]=nums[j]
}
}
return node+1
}
func main(){
a := [6]int{1,2,2,2,2,4}
fmt.Printf("使每个元素最多出现3次,返回删除后数组的新长度为:%v",removeDuplicates(a))
}
输入数组为:a=[1,2,2,2,2,4],使每个元素最多出现3次
经过函数
输出应该为:5
代码运行如下:
我们渐渐可以找到某种规律。
给你一个有序数组 nums
,请你原地删除重复出现的元素,使每个元素最多出现n
次 ,
返回删除后数组的新长度。
如果初始设定n
是一个值。
则我们的通用函数表达式可以为:
func removeDuplicates(nums []int) int {
node:=n-1
for j :=n;j<len(nums);j++{
if nums[j]!=nums[node-(n-1)]{
node++
nums[node]=nums[j]
}
}
return node+1
}
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。