小哆啦开始力扣每日一题的第四天
小哆啦的去重冒险:数字王国的挑战
在数字王国中,每个数字都有自己的位置和秩序,大家都非常希望能有一个完美的队列,确保没有重复的数字。然而,随着时间的推移,越来越多的重复数字出现在队伍中,导致了混乱。国王非常苦恼,决定举行一次挑战,找出解决重复数字的最佳方法。
而这个挑战的任务,落到了小哆啦身上。小哆啦可是数字王国中最聪明的少年,他决心要通过自己的智慧来解决这个问题。
第一站:初尝试——错误的代码
小哆啦满怀信心地开始了挑战。看着数字队列中的重复项,他决定使用最简单的方法:遍历数组,去掉重复的数字。他拿起了笔,开始编写代码。
这是他最初的代码:
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 计数器的逻辑并没有得到很好的处理,导致程序无法正常返回正确的数组长度。
“小哆啦,问题出在哪里了呢?”他开始深思。
他意识到,fast 和 show 两个指针的初始化方式似乎存在问题。而且,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; // 返回最终的去重后的长度
}
第四站:魔法的实现
小哆啦将修正后的代码运行了一遍,终于,数字队列中的重复数字被成功去除了。最重要的是,程序能够正确处理所有的特殊情况,比如只有一个数字的数组,或者所有数字相同的数组。
小哆啦看着代码,心里松了口气:“现在应该没问题了!”
第五站:数字王国的庆典
当小哆啦将去重法宝交给数字王国的居民们后,数字们欣喜若狂,纷纷跳起了欢快的舞蹈。
“谢谢你,小哆啦!你不仅帮助我们去除了重复的数字,还让我们的队伍重新变得整齐有序!”大家兴奋地说。
“是的,小哆啦,你的聪明才智简直无可匹敌!”数字们纷纷称赞道。
第六站:总结与启示
站在欢呼的人群中,小哆啦微笑着思考:“每个问题的解决都有一段旅程。最初的错误,让我更加深入地理解了问题,最终我才能找到最好的解决方案。”
他回头看了看自己修改后的代码,轻声说道:“每个挑战,都能让我们变得更加智慧。错误并不可怕,重要的是从错误中学习。”