首页 >

程序员遇到很难的技术问题是怎样的感觉 – 数据库 – 前端|

淘宝psd文件怎么用,ps如何发光效果图,赛尔号遗忘剂怎么用程序员遇到很难的技术问题是怎样的感觉 - 数据库 - 前端|程序员遇到很难的技术问题是怎样的感觉引子回字有四种种写法从一道小提说起算法是程序的灵魂打破砂锅问到底参考  本文由智客工坊–顶级码农原创,感谢您的阅读,预计阅读时长3min。

算法是程序的灵魂——佚名

引子

弹指间,在互联网行业已经十年了。

或许您也有这样的感受,在日常编码的过程中,一切看起来都是风轻云淡,各自安好。但是,代码发布的生产环境,总会出现一些不可预知的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


程序员遇到很难的技术问题是怎样的感觉 - 数据库 - 前端|
  • mysql 查询库,mysql重启库会不会解开死锁 - 数据库 - 前端,mysql查询分区表
  • mysql 查询库,mysql重启库会不会解开死锁 - 数据库 - 前端,mysql查询分区表 | mysql 查询库,mysql重启库会不会解开死锁 - 数据库 - 前端,mysql查询分区表 ...

    程序员遇到很难的技术问题是怎样的感觉 - 数据库 - 前端|
  • 无标题mysql数据查询,怎么样才能学好java编程 - 数据库 - 前端,mysql 日期函数大全
  • 无标题mysql数据查询,怎么样才能学好java编程 - 数据库 - 前端,mysql 日期函数大全 | 无标题mysql数据查询,怎么样才能学好java编程 - 数据库 - 前端,mysql 日期函数大全 ...

    程序员遇到很难的技术问题是怎样的感觉 - 数据库 - 前端|
  • mysql查询10条,MySql怎么查询前10条数据 - 数据库 - 前端,cassandra代替mysql
  • mysql查询10条,MySql怎么查询前10条数据 - 数据库 - 前端,cassandra代替mysql | mysql查询10条,MySql怎么查询前10条数据 - 数据库 - 前端,cassandra代替mysql ...