这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
重点内容
- 写代码的重点
- LeftPad事件
- 交通灯算法
- 洗牌算法
- 抢红包算法
写代码应该关注什么?
- 风格
- 约定
- 效率
- 设计
- 使用场景
我们评判一段代码是否好坏,不能从该函数是否具有最优的时间复杂度,是否具有最简洁的写法,是否具有最简单易懂的写法,是否是大牛写的而判断,而是必须客观公正的根据实际应用场景来看。所谓人不可貌相,说的大抵也是如此。例如,一段代码写的非常死板,不用循环,看起来也复用性差,但实际上,这正是他的优点。正是因为如此,他的时间复杂度是最低的。他能够更快的处理问题,在高性能的需求场景中反而是最优解。
Left-pad事件
事件本身的槽点:
- NPM模块粒度
- 代码风格
- 代码质量/效率
当年,Left-pad是一个被用于众多项目中的模块,然而实际上他只是一个短短几行代码的函数。它本不足以成为一个模块。但很意外,众多大型模块都依赖这个模块,所以当其删库后,引发了大量的事件。
仔细研究,可以发现当时它这个库写的可以有很多改进的地方,可以性能更好,代码更简洁易懂。
交通灯算法
实现一个交通灯切换的算法,可以很多种方法。常见的是数据抽象的算法。
const statelist = [
{
state:'wait', last: 1000
},{...},{...}]
洗牌算法
第一种
第一种就是做一个排序,排序的依据是一个0,1随机数,是0就往后放。
这种算法,虽然很巧妙,但是存在概率不公平的问题。
洗牌,必须概率一致。 这种算法,越前面的位置的数具有更大的机率在前面,这有很大缺陷。
第二种
随机选择一个位置的数据放到最后面,然后对剩余的数据做相同的操作。
这个方法很巧妙的,解决了上面第一种方法的缺陷。
分红包算法
分红包不能不够分,必须要有最小的限制。
第一种,切西瓜
每次都对金额list中最大的部分切开,按随机的比例切成两部分。以此类推,直至分完。
这种算法虽然没有不够分的问题,但有非常容易分布均匀的问题。
加隔板
将钱看作一个数组,分n个红包就是往上面加n-1个隔板。隔板的位置是随机的。
这种算法既不会造成不够分的情况,也不会造成分布过于均匀的情况。
实践
function generate(amount, count){
let ret = [amount];
while(count >1){
let cake = Math.max(...ret),
idx = ret.indexOf(cake),
part = 1 + Math.fllor((cake / 2) * Math.random()),
rest = cake - part;
ret.splice(idx,1,part,rest);
count--;
}
return ret;
}
总结
学习前端,其实掌握基本的算法也是必须的。不能因为自己缺乏数学天赋,就对算法敬而远之。想要学好前端,算法必不可缺!