关于80号问题

来源:3-4 即使简单的问题,也有很多优化的思路

慕粉3869017

2020-06-03

int k=0,count=0;
for (int i=0;i<nums.length;i++){
//如果nums[k]和nums[i]不相等,那么甭管count是几,都加入k指针指向的元素。
if (nums[k]!=nums[i]){
k++;
nums[k] = nums[i];
//有一个重复元素了。
count=1;
}else {
if (count<2){
k++;
nums[k] = nums[i];
count++;
}else {
continue;
}
}
}
return k;
1.老师,想不明白为啥我认为我的逻辑都是对的,而错误的测试用例结果中似乎总是第一个元素计数了3次。
2.还有下面的这种思路,也搞不清到底哪里的毛病?
int k=0;
for (int i=0;i<nums.length;i++){
if(i<2 || nums[i]>nums[i-2]){

            nums[k] = nums[i];
            k++;
        }
    }

    for (int i=0;i<nums.length;i++){
        System.out.print(" "+ nums[i]);
    }
    System.out.println();
    return k;

3.我似乎总是犯这个毛病,有些问题我知道答题思路,但是就是弄不对,不知道自己到底是哪里不对,为啥总犯这些毛病?

写回答

1回答

liuyubobobo

2020-06-03

对于 [1,1,1,2,2,3] 这个测试用例就出现了问题。我的建议是,你实际使用这个测试用例,用你的逻辑进行单步跟踪,实际看一下,在每一轮循环中,k 变成了多少?count 变成了多少?nums 又在怎么改变?为什么对于第三个数字,你明明觉得应该是 2,结果还是 1?在哪一步,你以为的逻辑和实际代码执行的逻辑不一样。


单步跟踪调试,自己去看自己的写的代码到底是怎么执行的,和自己认为的逻辑到底哪里不一样,是学习计算机的一个非常非常重要的方式,只有这样,才能越来越深刻的理解代码的执行过程,才能提高编程思维。学习计算机不是想出一个想法,直接就写出代码了。真实的软件工作,也是有大把时间需要 debug 的,甚至 debug 本身,就是编程能力的一个重要体现。可以参考我的文章《高效学习的秘密》的第 7 点:https://mp.weixin.qq.com/s?__biz=MzU4NTIxODYwMQ==&mid=2247483836&idx=1&sn=90854aa76507281403e4dd9cd434a12b&chksm=fd8caefacafb27ec78f999fde4f1217c04c6e2ff28cf51fe511d8fa29d484d9281ff91de8c9c&token=1441757834&lang=zh_CN#rd


请一定耐心,去调试你的程序,去真正的看自己的程序到底在怎么执行,怎么得到了错误的结果,而不只是去“想”程序。


最后,关于你说的“有些问题我知道答题思路,但是就是弄不对,不知道自己到底是哪里不对”,相信我,所有学习计算机的同学,都有这样的一个阶段。这本身就是计算机学习训练的重要任务:能够将自己头脑中的逻辑正确用代码表示出来。如果只是有思路就好了的话,计算机专业是没有活路的,大家都去学数学了。计算机专业的指责就是:把思路转换成正确的代码。请查看这篇文章的第四点:https://mp.weixin.qq.com/s?__biz=MzU4NTIxODYwMQ==&mid=2247484021&idx=1&sn=2901f32cbf44739645301d60ae55f926&chksm=fd8cad33cafb2425284e7db27b45496aa0f62963c1af41e574d31dd22b21878ecc095b87e419&token=1441757834&lang=zh_CN#rd


所以,不要着急,静静培养自己的这个能力。


加油!:)

2
2
liuyubobobo
回复
慕粉3869017
一边跟踪,一边在纸上记录。我试了一下,你的这个程序,对于 [1, 1, 1, 2] 这个数组,只有 4 个数据,就会复现错误。4 个数据,你的循环只会执行 4 轮,静下心来看,每轮循环的结果,nums 到底是什么?一步一步是怎么得到这个结果的?和你想象的是不是一样。这和笨不笨一点儿关系都没有,完全是要有耐心。加油!:)
2020-06-03
共2条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程