题目
想法
分析问题
题目意思大概为 提供给我们的数组是有序的,且每个数字最多出现2次,我们调整完毕后必须回写到该数组,并且返回正确的数据个数。
方法1: 定义临时数据求解
ps: 假设下标不会越界
将前2个数据写入临时节点数据
从第3个节点开始计算
若三个数据一致,则不往临时节点写入数据
当前节点以此往后移
三个节点数据不一致,则写入临时节点
直到数据至末尾
在写入临时节点的时候,进行自增,后将这个值返回回去即可
func removeDuplicates(nums []int) int { if len(nums) <= 2 { return len(nums) } var rn []int var last1num int var last2num int sum := 2 rn = append(rn, nums[0]) rn = append(rn, nums[1]) for i:=2;i<len(nums);i++ { last2num = nums[i-1] last1num = nums[i-2] if last1num == last2num && last2num == nums[i] { continue } rn = append(rn, nums[i]) sum++ } for i:=0;i<len(rn);i++ { nums[i] = rn[i] } return sum }
方法2: 在原数组基础上修改
因为题目中提到的 每个元素最多出现 2次 , 所以,不管怎么样,只要数组长度大于2 ,那么 前2个元素,一定是正确的。
不管数组后续内容是什么,在长度满足的条件下,前2个永远满足需求,所以从第三个元素开始判断是否要加入:
判断当前节点数据(1) 和 有效下标上一个数据(1) 相等,所以该数据不加入,正在处理的节点向后移动
判断当前节点数据(2)和 有效下标上一个数据(1) 不相等 , 所以加入该数据,加入方式为 有效下标+1, 将正在处理的节点 赋值 给 有效下标指向的数据
即
有效下标+1
当前数据赋值至有效下标指向的数据
正在处理的节点持续增加,直至末尾
由此,我们可以顺利编写出伪代码
func removeDuplicates(nums []int) int { if len(nums) <= 2 { return len(nums) } i = 2 // 有效指针 j = 3 // 正在处理的指针 for (;j<len(nums);j++) { if 当前节点 != 有效指针指向的上一个节点 i++ // 有效指针+1 有效指针指向的节点 = 当前节点 } return i }
代码编写
func removeDuplicates(nums []int) int { if len(nums) <= 2 { return len(nums) } var i = 1 // 有效指针 var j = 2 // 正在处理的指针 for ;j<len(nums);j++ { if nums[j] != nums[i-1] { i++ nums[i] = nums[j] } } return i+1 }
心得体会
当人有一个解决方案后,很难再想另外一套解决方案,如果我的文章不被打回来,我也应该不会去想第二套逻辑,我觉得我应该保持这种习惯,当解决问题后,能够认真复判,看看,能否有更高效的解决方案。