引子
弹指间,在互联网行业已经十年了。或许您也有这样的感受,在日常编码的过程中,一切看起来都是风轻云淡,各自安好。但是,代码发布的生产环境,总会出现一些不可预知的bug,或者遇到一些”诡异”的问题,他们就像幽灵一样潜伏在代码之中,并在某一个特定场景之下暴露出来。这是导致程序员们疯狂加班的罪魁祸首。回顾笔者的职业生涯中,导致加班到凌晨甚至通宵的一般都是算法问题。回字有四种写法
孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说,“对呀对呀!……回字有四样写法,你知道么?”偶愈不耐烦了,努着嘴走远。孔乙己刚用指甲蘸了酒,想在柜上写字,见偶毫不热心,便又叹一口气,显出极惋惜的样子。鲁迅笔下的孔乙己总是一副穷酸书生的形象,被人耻笑。然而,换个角度来看,从做学问上了讲,从一个严谨的技术的角度来看,孔乙己弄清楚回字的不同写法是很有必须要的。因为,每种回字的使用场景看能不同。那么,这个和算法有什么关系呢?这里说的算法不一定是有教材上的例举的经典算法,如大家耳熟能详的选择排序,冒泡,二叉树,最短路径算法….泛指一切从业务中抽象出来实现方法。算法是用来解决问题的方法,方法越多,支持的场景越多,拟解决问题的能力就越强。这就好像你拥有一个超级武器库,兵来将挡,水来土掩。从一道小提说起
这是最近一次项目迭代发版,让偶加班的问题(预计19点下班,足足搞到22点)。应用场景如下:给定用户登录/登出状态变更记录日志,实时计算用户的在线时长。到这里,笔者建议各位看官暂停10s,思考一下,这个需求您会如何实现呢? 欢迎在评论区留言交流。好了,这里不再卖关子了。这个问题背后其实蕴藏一个**删除数组中连续的重复项。**的算法问题。因为大家计算的在线时长是从在线状态到非在线状态之间间隔时间,然后将它们累加起来。而状态记录可能是5min记录一次,或者因为接口调用异常导致出现连续相同状态。正确地做法是对这些原始状态日志进行预处理,删除数组中连续的重复项。这里给出笔者的算法:这里给出两种实现方案(C#版本),Java,python的后续补充上):public static List<int> allStates = new List<int> { 1, 1, 2, 2, 2, 3, 3,3,3,4 };
实现方案1(正向遍历):
public static List<UserUseState> Remove2(List<UserUseState> list) { List<UserUseState> newArr = list; for (var i = 0; i < newArr.Count – 1; i++) { if (i == 0) continue; var currentItem = newArr[i]; var nextItem = newArr[i + 1]; if (currentItem.State == nextItem.State) { newArr.Remove(nextItem); i–; } } return newArr; }
实现方案2(反向遍历):
public static List<int> Remove3(List<int> list) { for (var i = 0; i < list.Count – 1; i++) { var currentItem = list[i]; var nextItem = list[i + 1]; if (currentItem == nextItem) { list.Remove(currentItem); i–; } } return list; }
算法是程序的灵魂
程序=数据结构+算法随着技术框架的大量出现,很多算法其实是被框架封装了。 这个确实降低了编程的门槛,但是对于很多新场景和实际应用,可能不一定会有现成的算法。 这个时候个人原本的算法思维能力就体现出来了。这个就很好理解为啥大厂面试总是会考察各种算法,因为这个在实际工作中真的用得上。比如, 提升数据库查询速度,代码优化等…有空的同学还是建议一个多关注一下算法,可以做一下练习。打破砂锅问到底
但是,话又说回来,普通的业务编程中其实是很少遇到刁钻的算法问题。可能前面架构师和高级工程师已经帮大家把这些问题都扫平了。但是,大家遇到问题的时候可以进一步去探究。比如,就拿这个看似很普通的计算在线时长的问题,还有没有别的更好地解决方案呢?答案是肯定的。有一个网友提供的方案,可以参考一下玩家在线时长统计有兴趣的同学可以详细进去看看:http://www.gtrdo.com/2019/01/30/玩家在线时长统计/在开发中,一定会遇到各种特殊场景和特殊的功能实现,遇到特殊的问题。遇到这些问题,多多琢磨一下,要有敢于打破砂锅问到底的精神,才能看问题更深入,探寻出多个解决方案,从而得到更佳解决方案。参考
https://www.52interview.com/Exercise/Daily