【青训营】写好JS——学好算法

简介: 【青训营】写好JS——学好算法

算法的核心是创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。


一个例子:判断是否为4的幂


力扣原题4的幂


给定一个整数,写一个函数来判断它是否是4的幂次方。如果是,返回true;否则,返回false


菜鸡入门


  • 负数直接排除
  • 循环除4,只要有一次不能整除就返回false
  • 循环完成返回true


var isPowerOfFour = function (n) {
  if (n <= 0) return false;
  while (n > 1) {
    if (n % 4) return false;
    n /= 4;
  }
  return true;
};
复制代码

位运算


将上一步的运算换为位运算:

  • n % 4可以用n & 0b11代替,按位与二进制11
  • n /= 4可以用n >>= 2代替,右移两位


var isPowerOfFour = function (n) {
  if (n <= 0) return false;
  while (n > 1) {
    if (n & 0b11) return false;
    n >>>= 2;
  }
  return true;
};
复制代码

位运算进阶


是4的幂的前提是2的幂,所以我们先进行两个判断:

  • 大于0
  • n & (n-1) === 0

如2的三次幂8,二进制为1000,7的二进制为0111,所以按位与的结果为0,进一步再判断是否为4的幂:

  • n & 0xAAAAAAAA === 0

观察4的幂的二进制:

image.png

可以看出4的幂的奇数位都为1,而0xA为二进制0b1010,所以将它们进行按位与,如果结果为0则证明其为4的幂。


var isPowerOfFour = function (n) {
  return n > 0 && (n & (n-1)) === 0 && (n & 0xAAAAAAAA) === 0;
};
复制代码

巧用正则


既然上一步我们已经发现了4的幂的二进制特点:


  • 1开头
  • 后面偶数个0


那么直接利用JS的特性写一个正则就可以了:


var isPowerOfFour = function (n) {
  n = n.toString(2);
  return /^1(?:00)*$/.test(n);
};
复制代码

更多位运算


lowbit操作用于截取一个数字的二进制最后一个1后面的所有位:


function lowbit(n) {
  return n & -n;
}
复制代码

或者你也可以用只保留最后一个1及其之前的所有位:


function lowbit(n) {
  return n & (n-1);
}
复制代码

求n的第k位二进制:


function k2(n) {
  return n >> k & 1;
}
复制代码
  • 使用左移得出二的次幂:


console.log(1 << 2)   // 1*4,2的2次方
console.log(2 << 4)   // 2*16
复制代码
  • 使用^切换0,1:


toggle ^= 1
复制代码
  • 使用&判断奇偶性:


console.log(5 & 1)  // 1,为奇数
console.log(6 & 1)  // 0,为偶数
复制代码
  • 使用^来完成值交换,比解构赋值快:


[a, b] = [b, a]
a ^= b
b ^= a
a ^= b


目录
相关文章
|
2月前
|
算法 JavaScript 前端开发
LZH 算法的模拟实现,JavaScript 版本
LZH 算法的模拟实现,JavaScript 版本
|
2月前
|
算法 JavaScript 前端开发
彩票中奖率的真相:用 JavaScript 看透彩票背后的随机算法(下)
至于分发?我们可以参考一下市面上已有的一些概念做一下对比,下面是笼统的一个网络服务器的TPS预估值,也就是说彩票服务器在1秒内可以处理的最大请求数:
|
2月前
|
数据采集 算法 JavaScript
彩票中奖率的真相:用 JavaScript 看透彩票背后的随机算法(上)
原本这篇文章是打算叫「假如我是彩票系统开发者」,但细想一下,如果在文章中引用太多的 JavaScript 的话,反而不是那么纯粹,毕竟也只是我的一厢情愿,彩票开发也不全如本文所讲,有所误导的话便也是得不偿失了。
|
14天前
|
算法 JavaScript 前端开发
在JavaScript中实现基本的碰撞检测算法,我们通常会用到矩形碰撞检测,也就是AABB(Axis-Aligned Bounding Box)碰撞检测
【6月更文挑战第16天】JavaScript中的基本碰撞检测涉及AABB(轴对齐边界框)方法,常用于2D游戏。`Rectangle`类定义了矩形的属性,并包含一个`collidesWith`方法,通过比较边界来检测碰撞。若两矩形无重叠部分,四个条件(关于边界相对位置)均需满足。此基础算法适用于简单场景,复杂情况可能需采用更高级的检测技术或物理引擎库。
49 6
|
7天前
|
JavaScript 前端开发 搜索推荐
JavaScript常见的排序算法详解
JavaScript常见的排序算法详解
11 1
|
4天前
|
算法 JavaScript 安全
一篇文章讲明白JavaScript_提交表单和MD5算法密码加密
一篇文章讲明白JavaScript_提交表单和MD5算法密码加密
|
4天前
|
算法 JavaScript 安全
一篇文章讲明白JavaScript_提交表单和MD5算法密码加密
一篇文章讲明白JavaScript_提交表单和MD5算法密码加密
|
2月前
|
算法 JavaScript 前端开发
三个js算法
三个js算法
12 2
|
2月前
|
算法 JavaScript
js的两个常用算法
js的两个常用算法
12 1
|
2月前
|
JavaScript 前端开发 算法
JavaScript的垃圾回收机制通过标记-清除算法自动管理内存
【5月更文挑战第11天】JavaScript的垃圾回收机制通过标记-清除算法自动管理内存,免除开发者处理内存泄漏问题。它从根对象开始遍历,标记活动对象,未标记的对象被视为垃圾并释放内存。优化技术包括分代收集和增量收集,以提升性能。然而,开发者仍需谨慎处理全局变量、闭包、定时器和DOM引用,防止内存泄漏,保证程序稳定性和性能。
30 0