原创算法:你的生命灵数是多少?
Halo Word!大家好,我是大家的林语冰(挨踢版)~
今天我们来共享一个原创算法——你的生命灵数是多少?
算法概述
所谓的“生命灵数算法”就是用来计算某个粉丝的生命灵数的一个小功能,祂的原理就是把该粉丝破蛋的年/月/日全部加起来,然后就没有然后了。
唯一的特点在于生命灵数必须累加到只剩个位数为止,即生命灵数必须是十进制基数,即永远在 0-9 之间任选其一,如果累加和大于等于 10,那么不会像十进制一样进位,而是继续拆开累加。
举个粒子,语冰的男神查斯特的破蛋日是 1976-03-20,那么祂的生命灵数算法步骤如下:
- 年月日逐个拆开累加:1+9+7+6+0+3+2+0 = 28
- 28 大于 10,继续拆开累加,2 + 8 = 10
- 10 等于 10,继续拆开累加,1 + 0 = 1
- 1 小于 10,所以查斯特的生命灵数就是 1
猫眼可见,生命灵数算法就是如此简单,但真正去设计和编程实现这个算法就会发现基础细节还挺多的。
你也可以采用别的思路累加,反正只要最后结果是在 0-9 之间即可,举个粒子:
- 两两累加,先计算年: 1 + 9 = 10
- 10 等于 10,继续拆开累加,1 + 0 = 1
- 1 小于 10,累加剩下的年数,1 + 7 = 8
- 8 小于 10,累加剩下的年数,8 + 6 = 14
- 14 大于 10,继续拆开累加, 1+ 4 = 5
- 5 小于 10,年数累加完毕,开始累加月数,5 + 0 = 5
- 以此类推......
语冰是用 ES6 来实现的,原理、源码甚至编程语言都没有任何要求,大家可以贯彻自己的 freestyle 参与挑战,笔试重点测评基本功,包括但不限于:
- 基础的算术运算,加减乘除等
- 基础的类型转换,参数是 String,操作数是 Number
- 基础的算法思想,迭代/递归等
- 其他三连可观看内容......
这个算法十行代码左右就能实现,虽然但是,看不见的 BUG 魔鬼在细节,源码怎么写得凡尔赛也是个问题。
像这种短小精悍的小功能但又五脏俱全的算法很适合用来笔试应届生/面试前几轮,考的就是基本功扎不扎实,难度不高,辨识度极强,平时有没有上机一试便知。
不想当键盘侠的喵星人不是好码农,这个算法其实不是传统那种深奥的套路,只是一个简单的计算功能,和编程语言没有强相关,即使不是前端人,也不烦用你擅长的编程语言来测评一下自己的生命灵数。
基本实现
为了照顾算法入门的小伙伴,语冰会结合代码给大家展示我的第一版源码实现,最后还会给出优化思路和笔试凡尔赛小技巧。
BTW,这个算法考察的是编程基本功,建议大家先自行尝试,十几行代码的笔试题花不了多少时间,如果实在没有头绪,再来偷看答案也不迟,但只有你知道你的知识盲区在哪里,一旦开卷笔试错过了反馈,就很难达到针对性的刻意练习了。
人族因为偷食禁果获得了智慧,有了羞耻心后开始穿裤子了,但同时也被造物主诅咒不得永生,史称“失乐园”。从下一行文字开始,大家也要被知识诅咒了,这只与你的决定有关。
我们按照第一种思路来实现。地球人都知道,程序 = 数据结构 + 算法,某种意义上而言,我们平时编程的所有功能都是一个特定的算法。设计算法实现功能可以优先借助流程图/伪代码厘清思路,因为算法步骤大抵都是顺序/分支/循环结构,这和我们的编程语言“图灵等价”。
厘清算法流程后,我们可以开始逐步编程, DIY 自己的源码,语冰这里以 ES6 举个粒子。
你知道的,所谓的生命灵数就是不断地迭代和累加,一讲到累加,大家就必须马上想到 Array.prototye.reduce()
相关的 API,如果你没想到,那说明你对数组这种数据结构的操作还不够敏感。(别在意,语冰当年笔试时也这样......)
其次,我们函数接收的是一个破蛋日字符串,这就涉及到 String
和 Array
的无缝衔接,还有动态类型语言经典的加法——+
既可以做加法,也可以拼接字符串。
猫眼可见,我们为了使用数组的 API,先对字符串进行转化。其次是累加的回调函数的设计,需要考虑我们现在数组里的都是字符而不是数字,其次还有日期分隔符要忽略不处理。
然后我们补全 reduce()
API 的 callback()
逻辑,这个 API 还有其他的参数,如果你需要,也可以使用,有不熟悉的地方参考 MDN 文档即可。
现在我们的第一轮累加就完成了,但是我们还需要判断 result
是不是在 0-9 之间,如果不是,继续拆开累加。
猫眼可见,我们的基本功能就实现了。
重构优化(凡尔赛版)
我们可以使用一些凡尔赛的黑科技稍微重构一下源码。
猫眼可见,我们的代码应该能对其他面试者降维打击吧,如果是应届生,那可能问题不大,但如果是 ES6 高玩,就可能要考虑优化等硬核要求。
优化思路:
- 我们用了若干循环,能不能一次到位?
- 一想到字符串,就要优先考虑正则表达式的可行性,尤其是笔试时,正则是你凡尔赛的一大利器,如果你没想到,赶紧去 MDN 面壁闭关!
- 解题思路设计优化
- 其他三连可观看内容......
免责声明
因为有不少粉丝质疑语冰的文章是 AI 辅助创作,其实大家想多了,单纯只是二次元挨踢技术宅的无限脑洞比较大罢了,本人家里确实有 CatCAT(AKA 薛定谔的盯裆猫),但真的不懂 ChatGPT。
由于现象级网文《诡秘之主》的迷因,本人对神秘学颇有涉猎。今天共享的“生命灵数”就是一个结合神秘学范畴的原创算法,全网首发,算是顺便自证清白,毕竟 GhatGPT 可不是卷毛狒狒,根本不知生命为何物。
语冰作为一个彻头彻尾的数学笨蛋,这个算法的难度自然老少皆宜,算法天花板是简单的四则运算,理论上小学生都能算出来,如果是会编程的小学生,理论上也是可以通过笔试的。
语冰会创造这个算法,除了神秘学的启发,还有就是回想起几年前面试珠海一家公司时也是有一个同等难度的算法——关于元音字母的,以后有机会再分享。
吾乃前端的虔信徒,传播 BUG 的福音。
我是大家的林语冰,我们一期一会,不散不见,掰掰~
转载自:https://juejin.cn/post/7244436362978508856