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算法一拼的做法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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日的 格式优化版:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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语言二级,非常遗憾,英语六级不知道报呢还是不报好。
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!