小哆啦的去重冒险:数字王国的挑战

182 阅读4分钟

小哆啦开始力扣每日一题的第四天

80. 删除有序数组中的重复项 II - 力扣(LeetCode)

小哆啦的去重冒险:数字王国的挑战

在数字王国中,每个数字都有自己的位置和秩序,大家都非常希望能有一个完美的队列,确保没有重复的数字。然而,随着时间的推移,越来越多的重复数字出现在队伍中,导致了混乱。国王非常苦恼,决定举行一次挑战,找出解决重复数字的最佳方法。

而这个挑战的任务,落到了小哆啦身上。小哆啦可是数字王国中最聪明的少年,他决心要通过自己的智慧来解决这个问题。

第一站:初尝试——错误的代码

小哆啦满怀信心地开始了挑战。看着数字队列中的重复项,他决定使用最简单的方法:遍历数组,去掉重复的数字。他拿起了笔,开始编写代码。

这是他最初的代码:

function removeDuplicates(nums: number[]): number {
    let show: number = 0, fast: number = 0, count: number = 0;
    while (fast < nums.length) {
        if (nums[show] === nums[fast]) {
            count++; // 增加计数
            if (count <= 2) {
                show++; // 只允许最多两次
                nums[show] = nums[fast];
            }
        } else {
            count = 1; // 数字不重复,重置计数器
        }
        fast++;
    }
    return show + 1; // 返回新的长度
}

小哆啦信心满满地运行了这个代码,但结果并不如他预期。虽然代码能够去除一些重复的数字,但他发现了一个问题——当数组只有一个数字时,程序并没有正确地处理。

第二站:问题的发现

“小哆啦,程序怎么还不行呢?”小哆啦开始困惑起来。是的,程序确实能去除重复的数字,但当数组只包含一个数字时,count 计数器的逻辑并没有得到很好的处理,导致程序无法正常返回正确的数组长度。

“小哆啦,问题出在哪里了呢?”他开始深思。

他意识到,fastshow 两个指针的初始化方式似乎存在问题。而且,count 计数器的逻辑也有些不清晰,导致程序在面对特殊情况时不能正确处理。最重要的是,当数组长度为 1 时,应该直接返回结果,而不是继续进入数组遍历的循环。

第三站:小哆啦的改进

小哆啦决定重新思考问题,逐步修正错误。他首先调整了指针的初始值,确保可以正确处理长度为 1 的数组。然后,他将 fast 指针的遍历方式和 show 指针的更新方式进行了更精细的调整。

这是小哆啦修正后的代码:

function removeDuplicates(nums: number[]): number {
    // 处理边界情况
    if (nums.length <= 1) return nums.length;

    let show: number = 0, count: number = 1;  // 初始化show指针和计数器
    for (let fast = 1; fast < nums.length; fast++) {
        if (nums[fast] === nums[show]) {
            count++;  // 如果当前数字和之前的数字相同,计数器加 1
        } else {
            count = 1;  // 如果是新数字,重置计数器
        }

        if (count <= 2) {  // 如果当前数字出现的次数小于等于 2,允许它进入去重后的数组
            show++;
            nums[show] = nums[fast];  // 放入新的位置
        }
    }
    return show + 1;  // 返回最终的去重后的长度
}

第四站:魔法的实现

小哆啦将修正后的代码运行了一遍,终于,数字队列中的重复数字被成功去除了。最重要的是,程序能够正确处理所有的特殊情况,比如只有一个数字的数组,或者所有数字相同的数组。

小哆啦看着代码,心里松了口气:“现在应该没问题了!”

第五站:数字王国的庆典

当小哆啦将去重法宝交给数字王国的居民们后,数字们欣喜若狂,纷纷跳起了欢快的舞蹈。

“谢谢你,小哆啦!你不仅帮助我们去除了重复的数字,还让我们的队伍重新变得整齐有序!”大家兴奋地说。

“是的,小哆啦,你的聪明才智简直无可匹敌!”数字们纷纷称赞道。

第六站:总结与启示

站在欢呼的人群中,小哆啦微笑着思考:“每个问题的解决都有一段旅程。最初的错误,让我更加深入地理解了问题,最终我才能找到最好的解决方案。”

他回头看了看自己修改后的代码,轻声说道:“每个挑战,都能让我们变得更加智慧。错误并不可怕,重要的是从错误中学习。”