关于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
所以,不要着急,静静培养自己的这个能力。
加油!:)
222020-06-03
相似问题