《剑指offer》——二进制中1的个数

首先,拿到问题不要害怕,我们先来看一下题目说的是什么:

示例1

输入:

10

返回值:

2

说明:

十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。

示例2

输入:

-1

返回值:

32

说明:

负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1

目录

a)算数运算法

b)算数运算法优化

c)循环按位比较法(推荐使用)

d)位运算优化方案  🔥


对于这道题思路有好几种,接下来我一一为大家分析!!

a)算数运算法

💨思路:

  • 首先,第一种最让人想到的其实就是对数进行算数运算,一直进行取模操作,即我们对输入的数进行循环模二的操作,每次模二之后即取出最后一位数,此时我们在进行判断操作,看是否为一,如果为一,则进行记录。

🔥注意事项:

  • 题目告诉我们的是输入【整数】,因此,这里还要区分正整数和负整数,所以如果是负整数我们还需要对其进行转换,转换为对应的补码在进行计算。

直接运算

代码如下:

class Solution {
public:
    int  NumberOf1(int n) {
    int count = 0;
    if (n < 0)
    {
        n = n & 0x7FFFFFFF; // 将负数转换为正数
        count++;            // 我们还应该考虑符号位进位的问题
    }

    for(int i=0 ;i<32; ++i)
    {
        if (n % 2 == 1)
            count++;
            n /= 2;
    }
    return count;
};

b)算数运算法优化

其实,我们可以发现,上述代码我们循环了32次(因为有32位),但是有时却完全没有必要进行如此多的循环,如当高位全是0的时候,如此多的循环,就会造成极大的浪费。此时就会衍生出第一种解决方案。

💨思路:

  • 我们通过【while】来判断,当然这种方法效率的提升充满不确定性。效率提升的多少跟数据 1  所在的位置有关系。
  • 我们通过【while】来直接判断是否为 0 ,在一定程度可以减少上一种方法导致的循环过多的弊端。

class Solution {
public:
    int  NumberOf1(int n) { 
    int count = 0;
    if (n < 0)
    {
        n = n & 0x7FFFFFFF; // 将负数转换为正数
        count++;            // 考虑符号位
    }
    
    while(n)               //用while代替循环
    {
        if (n % 2 == 1)
            count++;
            n /= 2;
    }
    return count;
  }
};

c)循环按位比较法(推荐使用)

上述代码可以吗?答案当然是可以的,但是如果这道题作为面试题的话,以上做法显然不是最优解,以上思想都是根据定义直接来求解,那么还有没有巧妙的方法呢?

答案当然是有的,我们可以通过位运算的思想来进行解决。我们知道,计算机的数字是由二进制表示,我们平常的运算是对整个数字进行运算,但是还可以按照二进制的每一位分别进行运算。常见运算有与、或、非、异或等。

💨思路:

  • 通过移位运算,每次移动一位。我们都只知道数字1与数字相位 与运算,而 与 运算的规则 则是同一结果就是1,因此将移位后的 1 与数字进行位与运算,结果为1就记录一次​​​​​​​ 这样我们只需要将数字1移位运算,就可以遍历二进制的每一位,再去做位与运算,结果为1的就是二进制中为1的。

代码如下:

class Solution {
public:
    int  NumberOf1(int n) { 
    int count = 0;
        if (n < 0)
        {
            n = n & 0x7FFFFFFF; // 将负数转换为正数
            count++;            // 考虑符号位
        }

        while(n)
        {
            if (n & 0x01 == 1)
                count++;
                n>>=1;
        }
        return count;
    }
};

或者像下述这样,此时就不需要在判断数的正负性了。

class Solution {
public:
      int  NumberOf1(int n) {
      int count = 0;

      for (int i = 0; i < 32; i++) 
      {
           if ((n & (1 << i)) != 0)
             count++;
      }
        return count;
   }
};

d)位运算优化方案  🔥

不知道大家看到这行知不知道什么意思呢?

n & (n−1)

我们的优化方案正是基于这种思想来进行求解的,具体什么意思呢?我来为大家解读一番。

💨思路:

  • 我们可以不断让当前的 n与  n−1做位与运算,直到 n的二进制全部变为 0 停止。因为每次运算会使得 n 的最低位的 1 被翻转成0,因此运算次数就等于 n 的二进制位中 1 的个数,由此统计1的个数。

 

代码如下:

class Solution {
  public:
    int  NumberOf1(int n) {
         int count = 0;
       

         while (n != 0)
         {
             n = n & (n - 1);
             count++;
         }
         return count;
   }
};

到此,这道题便讲解完毕了!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7802.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将Linux服务器上的项目上传至Github

使用git上传项目到github常规的步骤继续上传注意事项参考文章常规的步骤 初始化git空间 git init向缓冲区添加想要上传的文件 git add -f /data/xuhongbo/xuhongbo.code/unbiased_sgg_xuhongbo_BCL/maskrcnn_benchmark/*添加备注信息告诉机器&#xff0c;你真的要添加上述文…

vue在input中输入后,按回车,提交数据

vue在input中输入后&#xff0c;按回车&#xff0c;提交数据 1.展示效果如下&#xff1a; 2.代码展示&#xff1a; <div><el-input v-model"toAddNameText" keyup.enter.native"toAddName()" placeholder"回车&#xff0c;即新增该竖杆名称…

【C++】list的使用与模拟实现

目录 一、list介绍 二、list的使用 1、list的构造 2、list capacity 3、list element access 4、list iterator 5、list modifiers 5.1、insert 6、list Operations 6.1、sort 7、list的迭代器失效 三、list模拟实现 1、push_back 2、iterator 3、const iterato…

循环神经网络

循环神经网络(Recurrent Neural Network&#xff0c;RNN)与卷积神经网络一样,都是深度学习中的重要部分。循环神经网络可以看作一类具有短期记忆能力的神经网络。在循环神经网络中&#xff0c;神经元不但可以接收其他神经元的信息&#xff0c;也可以接收自身的信息&#xff0c;…

Python实现PDF转Word文档

1. 模块安装 pip install pdf2docx安装时可能报错&#xff1a; 到 Microsoft C Build Tools 下载C编译环境安装即可。 2. 模块介绍 pdf2docx是一个Python模块&#xff0c;可以用来将PDF文件转换成Word文档。它是基于Python的pdfminer和python-docx库开发的&#xff0c;可以…

toArray转换 java.lang.ClassCastException

[toArray转换踩坑 java.lang.ClassCastException] 问题 List<String> auditOptions Lists.newArrayList(); //一系列灌数据操作 auditOption.add... String[] options (String[]) auditOptions.toArray();报错信息java.lang.ClassCastException: class [Ljava.lang.O…

【Blender】如何在Blender中添加HDRI环境贴图

​ 什么是HDRI环境贴图 环境贴图或HDRI贴图是在Blender中照亮3D场景并实现逼真效果的最有效和最快捷的方法之一。 HDRIs本质上是现实世界照明的快照&#xff0c;其中包含高动态范围成像&#xff08;HDRI&#xff09;的准确照明细节。HDRI是一个包含亮度信息&#xff08;从暗…

ToBeWritten之IoT 技战法

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

VMware ESXi 8.0c - 领先的裸机 Hypervisor (sysin Custom Image)

本站发布 Dell 和 HPE 定制版 ESXi 8.0c 镜像 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 产品简介 VMware ESXi&#xff1a;专门构建的裸机 Hyperviso…

问卷调查怎么帮助餐饮行业?

在餐饮行业中&#xff0c;顾客的口碑占据非常重要的地位&#xff0c;直接影响着门店的销售额。好口碑能一传十、十传百&#xff0c;为门店带来持续不断的流量和收益。所以&#xff0c;在顾客体验这一块&#xff0c;餐饮门店要尤为重视。 某餐饮品牌作为全球知名品牌&#xff0…

MongoDB【使用场景简介体系结构数据模型特点】

目录 1&#xff1a;MongoDB相关概念 1.1&#xff1a;业务应用场景 1.2&#xff1a;MongoDB简介 1.3&#xff1a;体系结构 1.4&#xff1a;数据模型 1.5&#xff1a;MongoDB的特点 1&#xff1a;MongoDB相关概念 1.1&#xff1a;业务应用场景 传统的关系型数据库&#x…

AOP原理 - 分析AnnotationAwareAspectJAutoProxyCreator源码

文章目录一、回顾EnableAspectJAutoProxy二、AbstractAutoProxyCreator类三、AbstractAdvisorAutoProxyCreator类四、AspectJAwareAdvisorAutoProxyCreator类五、AnnotationAwareAspectJAutoProxyCreator类一、回顾EnableAspectJAutoProxy 在上一章中&#xff0c;通过查看Enabl…

Spring原理学习(三):BeanFactory后处理器原理解析与模拟实现

一、简单认识BeanFactory后处理器 1.1 BeanFactory后处理器的作用 接前文&#xff1a;Spring原理学习&#xff08;一&#xff09;&#xff1a;BeanFactory和ApplicationContext的原理和实现 我们已经简单介绍了 BeanFactory后处理器 的作用&#xff0c;今天我们先再来再次体验…

酒店拥有VR全景是一种什么样的体验?

每一家酒店都希望自己门庭若市&#xff0c;有更多的人来&#xff0c;随着信息化和互联网的发展时代的到来&#xff0c;酒店营销也逐渐加入了更多的现代元素&#xff0c;那么&#xff0c;酒店怎么样更好地利用互联网来做宣传、来获得更多的客户呢&#xff1f;VR全景作为新兴的富…

排序和分页

排序和分页一、排序1.简单用法3.不同字段不同排序现实二、分页1.简单分页2.order by 配合limit三、分页8.0新特性1.offset总结提示&#xff1a;以下是本篇文章正文内容 一、排序 1.简单用法 select employee_id,last_name,salary from employees order by salary;默认是升序…

Maven高级-分模块开发依赖管理

Maven高级-分模块开发&依赖管理1&#xff0c;分模块开发1.1 分模块开发设计1.2 分模块开发实现1.2.1 环境准备1.2.2 抽取domain层步骤1:创建新模块步骤2:项目中创建domain包步骤3:删除原项目中的domain包步骤4:建立依赖关系步骤5:编译maven_02_ssm项目步骤6:将项目安装本地…

Memory Map

主要介绍AM64x的MSRAM和DDR的内存分布&#xff1a; MSRAM:总共2MB,被分成8个banks,每个256KB。 首先了解一下&#xff0c;两种Domain: In TI documentation, the MCU Domain may be referred to as “M4FSS Island”, “MCU Island”, “MCU Channel”, or “MCU Subsystem…

Redis分布式缓存

文章目录一、 概述1. 单节点Redis存在的问题2. 单节点Redis问题针对解决方案二、Redis持久化1. RDB持久化2.RDB异步持久化原理介绍3. AOF持久化4. ROB和AOF对比三、Redis主从架构1. 搭建主从架构2. 主从数据同步原理四、Redis哨兵1. 哨兵的作用和原理2.搭建哨兵集群3. RedisTem…

Linux 操作系统原理 — RSS 多队列网卡

目录 文章目录目录RSS 多队列网卡RSS 技术实现原理RSS FilterRSS HASH硬中断信号绑定ethtool 操作指令RSS 多队列网卡 在以往&#xff0c;一张 NIC 只具有一个 Rx Queue&#xff0c;对应一个 CPU Core 来进行收包处理。在多核时代&#xff0c;为了充分利用 Multi-CPU Cores&am…

如何使用pandas提取含有指定字符串

这里写自定义目录标题name age state point0 Alice 24 NY 641 Bob 42 CA 922 Charlie 18 CA 70name age state point0 Alice 24 NY 642 Charlie 18 CA 700 False1 True2 TrueName: state, dtype: boolname age state point1 Bob 42 CA 922 Charlie 18 CA 700 True1 False2 True…