实在没想到能击败100%,忍不住嘚瑟一下:
这道题是leetcode第26题的姐妹篇,也是删除有序数组中的重复元素,但是重复元素需要保留两个。增加的这个小小要求可是不容易搞。
按照第26题的思路,不外乎双指针,设置一个起始指针(简称后指针)作为参照元素的索引号,以另外一个指针(简称前指针)控制循环体,把整个数组遍历一遍。官方解答是把前后指针初始值设置为一样,我则设置前指针的起始值靠后一位,后指针从0开始,前指针从1开始,这样前后指针的概念会更加清晰。如果前指针所指元素与后指针指向的元素不同,则把前指针所指元素赋值给后指针所指的下一个元素,起始时其实就是自己给自己赋值,到后面就会错开。赋值操作完成之后把后指针向后移动一格,然后继续前指针的循环。这里要说明一下,所谓有序数组就是说相同的元素只会挨着出现,我最开始理解成有序数组就是各个元素都有自己的位置,不能随便打乱但是同一个元素可以出现在各个位置,这样想了好几天也没有想到怎么办,直到大量搜索研究之后才知道我相差了。
以上是26题的解法,但是80题要求重复元素保留两个,这就很麻烦了,原来的代码里重复元素出现时没有任何动作,就是继续循环,现在要求保留两个就不能只循环了。于是想到增加一个变量k记录重复元素出现的次数,第二次出现时移动后指针继续循环,这样问题就来了,如果一个元素出现了四五次,那么这个k就很大了,这个元素重复结束之后进入下一个元素时这个k怎么把它回到起始值?思索良久终于解决。
代码如下:
如上图所示,k给定初始值1,也就是说每个元素至少会有一个,如果遇到重复的,这个k就加1,如果k=2也就是重复元素已经有两个了,此时按说不需要执行多余动作,只要把后指针移动一格就行了,但是这样在返回值处理上就会有大问题,返回值是修改后元素的长度,最后的几个元素重复和不重复这个长度就会不一样,于是干脆也执行一次赋值操作。在然后如果重复元素继续出现,则不进行其他动作,只是把k值继续增大,如此就到了前面所说的问题,那个k如何变回初始值,截图中可以看到我把k值的还原放在了再次出现不重复元素的地方,那么再下一次出现重复元素时就可以继续从起始值也就是1开始递增。
在我看来这几个问题的处理还是很值得记录一下的,上面击败100%并不能说明我多厉害,我不过是一个菜鸟,大咖们哪有时间刷这些无聊题目,只是看到这个结果对于我来说表示我在进步,比昨天又走远了一些,所以很高兴,如此而已。感谢看过本文章的所有人!
标签:26,初始值,重复,100%,元素,力扣,80,赋值,指针 From: https://blog.csdn.net/2401_87460766/article/details/143076288