这是我参与「第四届青训营 」笔记创作活动的第2天
在实际开发写代码过程中会考虑各种因素,例如风格、效率、使用场景。本文通过3个实例演示如何使用JavaScript解决问题。
字符串快速幂
问题:将一个字符串复制次并输出。
首先可以想到最朴素的做法,写一个for循环,将给定字符串不断添加到一个初始为空的字符串上,时间复杂度为。接下来考虑优化,利用快速幂的思想,将拆成2的幂次,这样只需复制次就可以解决问题,时间复杂度。以上时间复杂度的计算不考虑字符串连接的复杂度,当较小时两种解法效率差别不大。下面给出字符串的代码实现,输入框显示的是字符串复制的结果。
交通灯状态切换
问题:用JavaScript实现多个交通灯状态切换。
版本一
用无序列表来表示各个交通灯,CSS样式采用flex布局和ID选择器。用setTimeout函数指定每个交通灯亮的时间,交通灯循环闪烁,版本一代码实现如下。
版本一的代码实现较为简洁,但可读性较差,不容易扩展和维护。
版本二
将每个交通灯的颜色和停留时间存放在数组中,然后循环遍历数组,将数组中描述的状态展示在页面上,版本二代码实现如下。
相对于版本一的代码,版本二做了数据抽象,将内部实现和外部接口分离,扩展性更强。
版本三
将交通灯状态切换划分为几个步骤,每个步骤都封装为一个函数,也就是采用过程抽象。
版本三代码实现如下。
版本三代码使用了较多函数,灵活性和扩展性更好,但由于过度抽象,代码较为复杂。
版本四
采用异步和函数式编程,异步可以提高代码执行效率,函数式编程提高了代码的健壮性。
判断是否是4的幂
问题:判断一个整数是否是4的幂。
首先可以想到判断这个整数是否能一直整除4直到1,如果满足就是4的幂,时间复杂度,代码实现如下。
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的个数为偶数。基于这两个性质可写出下面的代码,时间复杂度。其中,num&(num-1)作用是去掉最低位1,num&0xAAAAAAAAAAAAA判断偶数位上是否有1。在下面的输入框中输入一个整数,点击“判断”按钮,如果字体显示为绿色说明是4的幂,如果显示为红色则说明不是4的幂。