关于clean code 的感想

最近在做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;
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值