返回

精研剑指offer:二进制中1的个数之JavaScript实现

前端

概述

二进制中1的个数是计算机科学中一个经典的算法问题。它要求计算给定整数的二进制表示中1的个数。这个问题在许多领域都有应用,例如位操作、数据压缩和密码学。

在本文中,我们将探讨如何使用JavaScript解决二进制中1的个数问题。我们将介绍常规的循环方法、位运算方法和递归方法。

常规循环方法

常规的循环方法是最简单和最直观的方法。它涉及到将整数转换为二进制字符串,然后遍历字符串并计算1的个数。以下是使用JavaScript实现的常规循环方法:

function countOnes(n) {
  // 将整数转换为二进制字符串
  let binaryString = n.toString(2);

  // 声明一个变量来存储1的个数
  let count = 0;

  // 遍历字符串并计算1的个数
  for (let i = 0; i < binaryString.length; i++) {
    if (binaryString[i] === '1') {
      count++;
    }
  }

  // 返回1的个数
  return count;
}

位运算方法

位运算方法利用了JavaScript的位运算符来计算1的个数。位运算符可以对二进制数字进行直接操作,因此可以比循环方法更快地计算1的个数。以下是使用JavaScript实现的位运算方法:

function countOnes(n) {
  // 声明一个变量来存储1的个数
  let count = 0;

  // 使用位运算符计算1的个数
  while (n > 0) {
    // 将n与1进行按位与运算
    count += n & 1;

    // 将n右移一位
    n = n >> 1;
  }

  // 返回1的个数
  return count;
}

递归方法

递归方法是通过递归调用函数来计算1的个数。在递归方法中,我们将把整数除以2并递归调用函数来计算1的个数。以下是使用JavaScript实现的递归方法:

function countOnes(n) {
  // 递归的终止条件
  if (n === 0) {
    return 0;
  }

  // 将n除以2并递归调用函数
  return (n & 1) + countOnes(n >> 1);
}

性能比较

以下是三种方法的性能比较:

方法 时间复杂度 空间复杂度
常规循环方法 O(n) O(1)
位运算方法 O(log n) O(1)
递归方法 O(log n) O(log n)

总结

在本文中,我们探讨了如何使用JavaScript解决二进制中1的个数问题。我们介绍了常规循环方法、位运算方法和递归方法。这三种方法各有优缺点,您可以根据自己的需要选择合适的方法。