【青训营】写好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 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
3月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
3月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
3月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
224 1
|
3月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
65 1
|
3月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
149 1
|
3月前
|
JavaScript 算法 前端开发
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
403 1
|
3月前
|
存储 缓存 自然语言处理
深入理解JS | 青训营笔记
深入理解JS | 青训营笔记
38 0
|
4月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
64 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
84 2