【 每天学习一点算法 2026/01/19】位1的个数

每天学习一点算法 2026/01/19

题目:位1的个数

给定一个正整数 n,编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。

  1. 最容易想到的方法就是,遍历二进制字符串,统计 1 的个数(找 1 怎么感觉怪怪的)

    typescript 复制代码
    function hammingWeight(n: number): number {
      const str = n.toString(2)
      let count = 0
      for (let i of str) {
        if (i === '1') count++
      }
      return count
    };
  2. 我们还有一种取巧的方法,js 字符串的 split 方法,可以分割字符串,如果们使用 1 分割字符串,那么结果数组长度减一就是 1 的个数

    复制代码
    function hammingWeight(n: number): number {
      const str = n.toString(2)
      return str.split('1').length - 1
    };
  3. 我们知道二进制是满二进一,那么二进制运算 n - 1 就是讲最右侧的 1 变成 0,让后讲这个 1 右侧的 0 变成 1,然后我们对 nn - 1 进行 & 运算

    按位与(&)的规则是:只有对应位都为 1 时,结果才为 1,否则为 0

    所以 n & (n - 1) 的结果就会将最右侧的 1 变成 0,我们循环执行 n = n & (n - 1) 直到 n 变成 0,循环次数就是 1 的个数

    typescript 复制代码
    function hammingWeight(n: number): number {
      let count = 0
      while (n) {
        n &= (n - 1)
        count++
      }
      return count
    };

题目来源:力扣(LeetCode)

相关推荐
yugi9878381 小时前
兰伯特问题求解的MATLAB实现
开发语言·算法·matlab
小年糕是糕手1 小时前
【35天从0开始备战蓝桥杯 -- Day4】
数据结构·c++·算法·leetcode·蓝桥杯
xiaoye-duck1 小时前
《算法题讲解指南:递归,搜索与回溯算法--递归》--1.汉诺塔,2.合并两个有序链表
数据结构·c++·算法
故以往之不谏1 小时前
算法专题--数组二分查找--Leetcode704题
c语言·开发语言·c++·算法·新人首发
herinspace1 小时前
管家婆iShop如何调整商品成本?
服务器·数据库·学习·电脑·excel
C+-C资深大佬1 小时前
C++ 模板进阶
开发语言·c++·算法
无尽的罚坐人生1 小时前
hot 100 98. 验证二叉搜索树
算法·leetcode
Coovally AI模型快速验证1 小时前
国产小龙虾方案实战:nanobot + 通义千问,钉钉上随时派活
人工智能·深度学习·学习·计算机视觉·3d
亚里随笔1 小时前
OpenClaw-RL:让AI Agent在对话中自主学习进化
人工智能·学习·llm·rl·agentic
liu-yonggang1 小时前
ROS2 性能优化与功能增强方案
大数据·算法·性能优化