leetcode 201 数字范围按位与 (位运算)

Code-201-Reading-Notes 代码201阅读笔记 我是谁: 我的名字叫Bader Al Shawabkeh,是一位机械工程师,他对开发软件,区块链以及与第四次工业革命有关的一切感兴趣。在此页面上,我向您介绍一些与程序开发有关的主题。 主题: 学科 关联 代码102的阅读说明 HTML&JS 第02类 html + java 今天我学到了 [今天我学到医学博士](今天我学到医学博士) html1&java 今天_我_学习了2 Today_i_learned3 Today_I_learned4 关于我 HTML Images_CSS颜色 [HTML Images_CSS颜色](HTML Images_CSS颜色) 立即下载

给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
加粗样式
示例 1:

输入: [5,7]
输出: 4

示例 2:

输入: [0,1]
输出: 0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range/

暴力解法:

按题目意思把所有数按位与可以很容易得到以下程序:

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
     int ans=m;
     for(int i=m+1;i<=n;i++){
      ans=ans&i;   
     }
    return ans; 
    }
};

因为一般 O(n)时间复杂度复杂度能解决的问题对应循环次数一般在1e8以内 ,所以这个解法必然会因为超时而行不通。

官网题解思路:

思路:[m,n]区间里元素的全都按位与就等同于m和n表示成二进制以后的公共前缀对应的数值。这个思路估计大部分人都想不到(我也是QWQ),刚看到的时候肯定也是很懵。我姑且就来尝试说一下这个二进制的公共前缀对应的数值为什么就是答案。

为什么对:

首先通过下面的4个描述建立一个较直观的感受(描述的位基于数的二进制):
1.按位与运算的一个特点是如果这一位上有一个0出现,那这一位按位与的结果必然是0。
2.m和m+1的最后一位一个是1,另一个是0。按位与的结果最后一位必然为0。
3.m在不断加1的过程中如果产生了进位,把m和这些不断加1后的数按位与,那么进位(包括进位)之后的数都会为变成0。
4.由于[m,n]区间中的数是连续的整数,在区间跨度不是很大,进位没有很多的情况下,前面的一部分数都一样,即存在公共前缀。

为什么对:假设m在不断加1并产生一定数量的进位,并最终到n的过程中,最高位进位的位置是第i位。那么中间过程必然存在一个x值的i-1位为011111…1,而(x+1)即恰好产生进位的数为100000…0。按位与就会让后面的i位全为0,即便(x+1)再加1之后还有进位,只要不到(i+1),按位与的结果就不会变化。

正解一:

把m和n同时右移,两者相等时的m(或n)就是前缀,再左移回来。

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
    int   move=0;  
    while(m!=n){    //把m,n右移直到相等
     m=m>>1;
     n=n>>1;
     move++;     //move记录右移的次数
    }
    return m<<move;  //把前缀左移回来  
    }
};
正解二

由上面的解法可以发现,把前缀后面的数全部置为0也能达到目的。 引入Brian Kernighan 算法:n&(n-1)可以实现把n的二进制数最低位的1置为0的目的。如下图,当n=12时,12&(12-1)就是把12的最低位即第3位的1变为0的结果。
在这里插入图片描述
基于前缀和的思想,把较大数n不断去掉最后一位1直到n<=m就得到答案:

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
   while (m < n) {    / / 不断去掉 n的最后一位1直到n<=m
        n = n & (n - 1);  
      }
      return  n;
    }
};

上一篇博客:离散化实现详解

code-201-reading-notes 代码201阅读笔记 在此站点上,将显示我的阅读笔记,并总结了一些重要信息 :writing_hand: 主题 关联 Html_1 && JavaScript_1 Html_2 && JavaScript_2 HTML_3 && JavaScript_3 HTML_4 && JavaScript_4 图像-颜色-文本 对象$$问题域 表$$域建模 布局-css 立即下载

相关推荐

开源DIY龙门架:从零构建可编程运动控制平台

运动控制是自动化与机器人技术的核心基础,它通过精确指令驱动执行机构,实现物体的定位与轨迹规划。其原理通常涉及控制器、驱动器、电机与传动机构的协同工作,核心价值在于将数字指令转化为精准的物理运动,从而解放人力并提升作业一致性。在工业自动化、桌面制造(如3D打印、激光雕刻)及教育机器人等领域应用广泛。本文聚焦于一个具体的工程实践案例:使用**铝型材**、**3D打印**零件、Arduino控制器及步进电机,从机械结构设计、电路连接到代码编写,手把手教你打造一个模块化、可扩展的开源龙门架系统。该系统不仅成本可控,

weixin_33168937的博客 618

http statusCode(状态码) 200、300、400、500序列

201-206都表示服务器成功处理了请求的状态代码,说明网页可以正常访问。         200(成功)  服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。         201(已创建)  请求成功且服务器已创建了新的资源。         202(已接受)  服务器已接受了请求,但尚未对其进行处理。         203(非授权信息)  服务器已成功处理了请求,但返回

ToBeTheBestman的专栏 2万+

thinkphp5.0.24反序列化漏洞分析

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

m0_67392182的博客 1871

一些接口

1.用户模糊搜索 http请求方式: POST(使用http协议) http://localhost:8080/admin/fuzzyQuery 参数 是否必须 参数说明 queryString(String) 是(为空搜索全部) 搜索关键字 – – – pagenum(int) 是 页数 – – – pagesize(int) 是 每页数据数 {"co...

qq_42951424的博客 447

说一说系统/子系统规格说明

《系统/子系统规格说明》都是从用户的角度以软件的维度来描述系统的功能、性能、业务流程、数据流和控制流等,并描述内外部接口需求、资源使用情况等.

weixin_40725543的博客 5429

核密度估计及其Python实践

一、参数估计简介 很多情况下,我们只有有限的样本集,而类条件概率密度函数p(x|ωi)和先验概率P(ωi)是未知的,需要根据已有样本进行参数估计,然后将估计值当作真实值来使用。 由给定样本集求解随机变量的分布密度函数问题是统计机器学习和概率统计学的基本问题之一。解决该问题的方法包括参数估计和非参数估计两大类: 1.参数估计方法 已知概率密度函数的形式而函数的有关参数未知,通过估计参数来估计概率密度函数的方法。有两种主要参数估计法:确定性参数估计方法是把参数看作确定而未知的, 典型方法为最大似然估计。随机参数

袁易学的博客(Yuan Yixue's Blog) 1万+

鸿蒙开发通用错误码

BusinessError 401: Parameter error. The type of "${参数名}" must be ${正确的类型}[or ${其他正确的输入}].该设备不支持此API,通常用于在设备已支持该SysCap时,针对其少量的API的支持处理。该错误码表示权限校验失败,通常为没有权限,却调用了需要权限的API。非系统应用,使用了系统API,请校验是否使用了系统API。权限校验失败,应用无权限使用该API,需要申请权限。参数检查失败,包括必选参数没有传入,参数类型错误。

qq_51696509的博客 4013

IEC61850实战:从ICD文件解析到模型构建

本文深入解析IEC61850标准中的ICD文件结构,从Header、IED到DataTypeTemplates部分,详细介绍了如何构建电力自动化设备的数据模型。通过实战案例展示ICD文件的创建过程,并分享常见问题的调试技巧,帮助工程师快速掌握IEC61850建模方法,提升电力系统自动化项目的实施效率。

weixin_26841743的博客 496

http状态码

从网上找资料整理的的http状态码 200(成功) 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。 201(已创建) 请求成功且服务器已创建了新的资源。 202(已接受) 服务器已接受了请求,但尚未对其进行处理。 203(非授权信息) 服务器已成功处理了请求,但返回了可能来自另一来源的信息。 204(无内容) 服务器成功处理了请求,但未返回任...

weixin_34203426的博客 1486

osg3.6.5---osgEarth3.2 实现数字地球的加载

目前我在网上找得比较多的是osgearth2.10及以下的版本及加载数字地球的方法,但是我使用的是osg3.6.5和osgEarth3.。但是3.x版本和2.x版本差别很大,主要区别在于2.x有7个主要库,而3.x版本只有osgEarth这一个库。所以,特别记录一下。后面我讲他集成到qt的窗体在上传更新新的代码。1.直接上源码pro文件和cpp文件。

枫影竹韵的博客 1008

MMORPG网络游戏开发之任务系统的架构与设计

在网路游戏中做任务已经成为游戏很重要的一个核心功能和玩法,如何做好一个灵活可扩展的任务系统的架构与设计,今天来给大家分享一些我们的设计经验。接下来我把整个的任务系统分成以下6个模块:对于单机游戏而言,这6个模块都放在客户端直接处理,对于网路游戏而言,模块1~5实现在服务端,模块6实现在客户端。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习unity的零基础小白,也有一些正在从事unity开发的技术大佬,欢迎你来交流学习。...

voidinit的专栏 3049

leetcode (力扣) 201. 数字范围按位与 (位运算)

给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。这样思路就简单了,两个数的二进制不断往右移动,当两者相等的时候,停止移动。记t为移动的次数,t就是两个数的二进制不同的位数。而一个数不断加1变成另一个数的过程中,实际上每一位都有变成0的情况。这里可以回想一下二进制与操作,两个数的‘’与‘’只要有0则为0。输入:left = 5, right = 7。输入:left = 0, right = 0。

深度不学习!!的博客 581

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LeetCode 201. 数字范围按位与(位运算)

文章目录1. 题目2. 解题2.1 按位查找02.2 两数直接都往右移动,直到相等 1. 题目 给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。 示例 1: 输入: [5,7] 输出: 4 示例 2: 输入: [0,1] 输出: 0 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range

Michael是个半路程序员 1973

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

leetcode 201. 数字范围按位与 区间按位与 位运算

数字范围按位与 给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。 示例 1: 输入: [5,7] 输出: 4 示例 2: 输入: [0,1] 输出: 0 题意 : 求区间[L,R][L,R][L,R]内所有数字的按位与 例如 : [3,6][3,6][3,6]的ans=3&4&5&6=0ans=3\&4\&5\&6=0ans=3&4&.

马角的逆袭的博客 1065

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

leetcode 201:数字范围按位与 —— 想不到的位运算

遇到一个很套路的题目,leetcode题目地址。 给定范围 [m, n],其中 0 <= m <= n <= 2147483647, 返回此范围内所有数字的按位与(包含 m, n 两端点)。 示例 1: 输入: [5,7] 输出: 4 示例 2: 输入: [0,1] 输出: 0 我首先想到的,直接位运算 public int rangeBitwiseAnd(int m, int n) { int temp = m; int result

every__day的博客 504

LeetCode 201. 数字范围按位与:位运算高效解题指南

本文深入解析了LeetCode「数字范围按位与」问题的位运算解法。通过分析按位与的特性,指出暴力遍历法效率低下的问题,提出了基于公共前缀的高效算法:通过不断右移left和right找到它们的公共前缀,然后左移补零得到最终结果。文章详细解释了算法原理,提供了TypeScript代码实现,并通过具体示例验证了方法的正确性,同时讨论了边界情况的处理。该解法将时间复杂度优化至O(log n),展示了位运算在算法优化中的核心价值。

2401_86788218的博客 330

【LeetCode:201. 数字范围按位与 | 位运算】

【LeetCode:201. 数字范围按位与 | 位运算】给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。

Coder_ljw的博客 275

(位运算)leetcode201:数字范围按位与

题目 给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。 示例 1: 输入: [5,7] 输出: 4 示例 2: 输入: [0,1] 输出: 0 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/bitwise-and-of-numbers...

sdsc1314的博客 434

LeetCode 201——数字范围按位与(位运算)

一、题目介绍 给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。 示例 1: 输入:left = 5, right = 7 输出:4 示例 2: 输入:left = 0, right = 0 输出:0 示例 3: 输入:left = 1, right = 2147483647 输出:0 提示: 0 <= left <= right <= 231 - 1 来源:力扣

Asher 282

位运算:力扣201. 数字范围按位与

1、题目描述: 2、题解: 方法:位运算 数字范围按位与,取其高位无变化数 class Solution: def rangeBitwiseAnd(self, m: int, n: int) -> int: i = 0 #统计低位有多少位为0 while m != n: #高位不等就循环 m >>= 1 n >>= 1 i += 1 return m

weixin_42042056的博客 292

Leetcode:201. 数字范围按位与(位运算)

201. 数字范围按位与 给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。 示例 1: 输入: [5,7] 输出: 4 示例 2: 输入: [0,1] 输出: 0 这道题做法很巧妙。很厉害,为什么呢,因为m——n中必然发生了二进制中至少一位的变化,那么这一位如果不影响到左边的二进制,那么向右移动后,m与n相等,在左移就是正确答案 如果进1后影响到了左边的数,说明m——n中必定这一位出现相反的数

stackempty2的博客 248

[Leetcode][第201题][JAVA][数字范围按位与][位运算][Brian Kernighan]

【问题描述】[中等] 【解答思路】 1. 暴力 逐位与 ,只需要判断i= 0 或 i == 2147483647 的话,就跳出 for 循环即可。 时间复杂度:O(N) 空间复杂度:O(1) public int rangeBitwiseAnd(int m, int n) { //m 要赋值给 i,所以提前判断一下 if(m == Integer.MAX_VALUE){ return m; } int res = m; for (int i

dadongwudi的博客 290

【画图分析】Leetcode 201 题 数字范围按位与(标签:位运算)

文章目录题目描述思路分析技术公众号:小猿君的算法笔记 题目描述 给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。 示例1: 输入:[5,7] 输出:4 示例2: 输入:[0,1] 输出:0 思路分析 按照题目的要求,如果逐个按位与,那么在 m 、n 范围较大的情况下,将会出现超时。 对题目中所给用例 [5,7] 按位与运算: 1、可以看到,5 和 7 二进制形式存在公共前缀 01 ,因此从 5 →

笑忘哭的博客 452
上一篇: 离散化实现详解
下一篇: leetcode 78 子集 (位运算)
准图灵奖得主
博客等级 码龄8年 355粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值