最近在做Leetcode,我然后有看cleancodehandbook。
我之前没有接受过ACM 竞赛的训练,在写clean codes 和 fast code 方面确实非常欠缺。具体表现在:
1)离开智能的IDE就没法code, 敲三个字母就要等hint list提供选项给我选。面试的时候,都是在OJ 上, OJ上不光没有hint list, 连语法提示都没有。开始刷LeetCode以后,我强迫自己用Sublime Text+CMD 来编程,现在习惯了这种“简陋”的开发环境了以后,感觉效率反倒是蛮高的。如果小程序或者工程不大,真的可以考虑用sublime开发。另外一个收获是自己代码通过率开始提高了。因为没有语法提示,自己会下意识的检查语法,然后动手到Java API里查文档。这要是在以前,不是万不得已, 写JAVA万年不看Java API,全都靠Eclipse。
离开IDE以后,现在有时候甚至编译两次就通过。 以前,用记事本写个hello world 都有可能出错。
2)code 臃肿,流程控制混乱。 可能上之前写的东西,都是完全应用性的东西,没有很强的逻辑在里面,基本上不用动脑子,写代码就是Android.com >>baidu>>google>>android.com>>github>>CSDN, 看完了解了某个功能如何实现,就开始写了。 现在开始写leetcode,有些题目不是很难,但是都是纯计算,对思路、算法要求高的多。经过这段时间的训练和阅读算法导论,觉得自己在这方面有点起色了,但是基本功还是不扎实。
这里贴上两个代码,来记录自己的进步。
第一个代码代码臃肿,代码运行路径混乱,而且运行超市,没有通过。
/**
*Implement strStr().
*Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
*/
public class Solution {
public int strStr(String haystack, String needle) {// haystack=a, needle=a
if(needle.length()==0) return 0;
for(int i=0;i<haystack.length();i++){ //i=1
int j=0;
int index=i;
while(i<haystack.length()&&j<needle.length()&& haystack.charAt(i)==needle.charAt(j) ){
j++;i++;
}
if(j==needle.length()) return index;
else {j=0; i=index+1;}
}
return -1;
}
}
以前我是反感使用i,j 这样的变量名的,现在发现,如果对短小的变量名使用形成良好的,一直的使用规律,其实用起来挺不错的。比如,我现在所有的代码里,i代表头,或者1,j 代表尾或者2,这样用起来可读性其实不差。
以上代码流程控制过去复杂。这是一个暴力破解算法,思路从内外层循环,内外层跳出条件,最后考虑内外层要做的操作。
1)外层对haystack的每个字母遍历,内层对needle 遍历。
2)外层的跳出条件是 a> i指针指到了 haystack.length()-needle.length() 内层跳出条件为: a>j指针指导了needle队尾 b>*i!=*j
3) 外层执行,返回-1, 内层执行,检测是否出现全等子序列,如果有,返回i值。
以下贴出按以上思路,我自己的clean 代码,
public class Solution {
public int strStr(String haystack, String needle) {
for(int i=0;i<haystack.length()-needle.length()+1;i++){
int j=0;
for(;j<needle.length()&& haystack.charAt(i)==needle.charAt(j);j++) i++;
i=i-j;
if(j==needle.length()) return i;
}
return -1;
}
}
最后,贴出cleancode上给出的代码,可以看到,还是有很大差距的,人家的代码更加的clean。简直洁癖
public class Solution {
public int strStr(String haystack, String needle) {
for(int i=0;i<haystack.length()-needle.length()+1;i++){
<span style="white-space:pre"> </span>int j=0;
<span style="white-space:pre"> </span>for(;j<needle.length()&& haystack.charAt(i)==needle.charAt(j);j++) i++;
<span style="white-space:pre"> </span>i=i-j;
<span style="white-space:pre"> </span>if(j==needle.length()) return i;
}
return -1;
}
}