2014年2月中旬,我上升到挑战python英雄榜第3名。这是我寒假修炼算法的成果之一。来一下总结吧!

Linux的创始人Linus Torvalds在一次演讲中有一段涉及“什么才是优秀程序员”的话:

“烂程序员关心的是代码。好程序员关心的是数据结构和它们之间的关系。”

由这句话的启发开始,加上我越来越觉得自己编程能力不足,码代码经常要重构,逻辑思维不过细腻谨慎。正是过于关注代码,完成率所致。我已经学过C/C++/nasm/java/python/html/js/jq/shell等等语言,对计算机世界的工作原理有比较好的认识,但代码能力一直上不去。我想算法,就是我的瓶颈。于是有了以下故事。

第一阶段

寒假开始,我便在项目工作之余扫pythontip上的题。十几天里,有时一天7、8道题,有时2、3题,我的排名慢慢从第N页到第4页到第2页,让后到第1页。

当我扫完101题后,我成功了42题,刚好排在第一页最后一名。然后我休息了一下,继续有成功几题。这大概就是我的无算法时代极限了。

第二阶段

我网搜博客,算法,学习排序。好来买了《编程珠玑》和《编程之美》,边看边攻克pyhtontip上的题目。

在PythonTip 上的一些水题这博客中学习了很多,尤其是看到问题一句话就解决时,恍然大悟。

1、有很多利用lambda, reduce, map, zip, 列表分片/解析, sum, max, min, divmod, round, hex/oct/bin; set,list,dict; 一句话解决的。这是我认为python强大原因,非常好用。

2、关于二进制‘1’的处理是非常妙的,这些题往往诠释了计算机较人类思维不同的特性,以及如何能让程序员思考得更“计算机”一些。在《编程之美》,上面提到的博客中都有提到。

3、独立思考,让后比较,我获得更多。在最大连续子序列,最大非连续子序列,最长回文子字符串中,我收获很经典的算法。同时还想出来与Manacher算法一拼的做法。

L = '#'.join(list(L)) # len is odd now!
l = len(L)

o,r=0,0 # 圆心,半径(不计圆心)
for i in range(1,l):
    if i+r<l and L[i-r:i] == L[i+r:i:-1]: # 移到:最右方便来计算
        o,r=i,r
        while i+r+1<l and L[i-r-1] == L[i+r+1]:
            r += 1
    # print L[o-r:o+r+1]

L1 = L[o-r:o+r+1]
t1,t2 = L1[::2],L1[1::2]

print t1 if any(i!='#' for i in t1) else t2

3月13日的 格式优化版:

L = '#'.join(L)
L = '#'+L+'#'  # 因为这句,末尾print语句统一了。

o,r = 0,0
l = len(L)
for i in xrange(l):
    if i+r >= l:
        break
    if L[i-r:i]==L[i+r:i:-1]:
        o = i

        j = r+1 # 尝试加一
        while o-j>=0 and o+j<l and L[o-j] == L[o+j]:
            j += 1
        r = j-1

print L[o-r+1:o+r:2]

又经过10多天,我又扫完一遍题,这次我以72题的成绩排在GodIsCoding和YOSHINO之后第三名。

总结:

做完之后,我的感觉是,python是很美很简单语言,如其名。

生活题外话:

没能及时报考C语言二级,非常遗憾,英语六级不知道报呢还是不报好。



原文出自发表的https://blog.pythonwood.com/2014/02/寒假挑战PythonTip(一人一python)总结——算法是程序的灵魂,程序员的心法/



扩展阅读