JavaScript(下) | 青训营笔记

105 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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;
}

总结

学习前端,其实掌握基本的算法也是必须的。不能因为自己缺乏数学天赋,就对算法敬而远之。想要学好前端,算法必不可缺!

参考

bytedance.feishu.cn/file/boxcnD…