题目描述(中等难度)

    的升级版,给定一个数组,每个数字只允许出现 2 次,将满足条件的数字全部移到前边,并且返回有多少数字。例如 [ 1, 1, 1, 2, 2, 3, 4, 4, 4, 4 ],要变为 [ 1, 1, 2, 2, 3, 4, 4 …] 剩余部分的数字不要求。

    解法一 快慢指针

    利用26 题的思想,慢指针指向满足条件的数字的末尾,快指针遍历原数组。并且用一个变量记录当前末尾数字出现了几次,防止超过两次。

    时间复杂度:O(n)。

    解法二

    参考,解法一中,我们用一个变量 count 记录了末尾数字出现了几次。而由于给定的数组是有序的,我们可以更直接。将当前快指针遍历的数字和慢指针指向的数字的前一个数字比较(也就是满足条件的倒数第 2 个数),如果相等,因为有序,所有倒数第 1 个数字和倒数第 2 个数字都等于当前数字,再添加就超过 2 个了,所有不添加,如果不相等,那么就添加。s 代表 slow,f 代表 fast。

    时间复杂度:O(n)。

    空间复杂度:O(1)。

    添加好友一起进步~

    如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^