JavaScript写算法 | 青训营笔记

217 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第2天

在实际开发写代码过程中会考虑各种因素,例如风格、效率、使用场景。本文通过3个实例演示如何使用JavaScript解决问题。

字符串快速幂

问题:将一个字符串复制nn次并输出。

首先可以想到最朴素的做法,写一个for循环,将给定字符串不断添加到一个初始为空的字符串上,时间复杂度为O(n)O(n)。接下来考虑优化,利用快速幂的思想,将nn拆成2的幂次,这样只需复制log(n)log(n)次就可以解决问题,时间复杂度O(log(n))O(log(n))。以上时间复杂度的计算不考虑字符串连接的复杂度,当nn较小时两种解法效率差别不大。下面给出字符串的代码实现,输入框显示的是字符串复制的结果。

交通灯状态切换

问题:用JavaScript实现多个交通灯状态切换。

版本一

用无序列表来表示各个交通灯,CSS样式采用flex布局和ID选择器。用setTimeout函数指定每个交通灯亮的时间,交通灯循环闪烁,版本一代码实现如下。 版本一的代码实现较为简洁,但可读性较差,不容易扩展和维护。

版本二

将每个交通灯的颜色和停留时间存放在数组中,然后循环遍历数组,将数组中描述的状态展示在页面上,版本二代码实现如下。

相对于版本一的代码,版本二做了数据抽象,将内部实现和外部接口分离,扩展性更强。

版本三

将交通灯状态切换划分为几个步骤,每个步骤都封装为一个函数,也就是采用过程抽象。 过程抽象.PNG

版本三代码实现如下。

版本三代码使用了较多函数,灵活性和扩展性更好,但由于过度抽象,代码较为复杂。

版本四

采用异步和函数式编程,异步可以提高代码执行效率,函数式编程提高了代码的健壮性。

判断是否是4的幂

问题:判断一个整数是否是4的幂。

首先可以想到判断这个整数是否能一直整除4直到1,如果满足就是4的幂,时间复杂度O(log(n))O(log(n)),代码实现如下。

function isPowerOfFour(num) {
    num = parseInt(num);
    while(num > 1) {
        if(num % 4) return false;
        num /= 4;
    }
    return num === 1;
}

接下来考虑4的幂有哪些性质。1是整数范围内最小的4的幂,其他整数范围内4的幂都可以在1的基础上不断乘4得到,乘4在二进制中就是左移两位。于是可以发现4的幂二进制表示只有一个1,且1后面0的个数为偶数。基于这两个性质可写出下面的代码,时间复杂度O(1)O(1)。其中,num&(num-1)作用是去掉numnum最低位1,num&0xAAAAAAAAAAAAA判断numnum偶数位上是否有1。在下面的输入框中输入一个整数,点击“判断”按钮,如果字体显示为绿色说明是4的幂,如果显示为红色则说明不是4的幂。