【leetcode】201. 数字范围按位与(bitwise-and-of-numbers-range)(位运算)[中等]

2023-05-16

链接

https://leetcode-cn.com/problems/bitwise-and-of-numbers-range/

耗时

解题:1 h 21 min
题解:28 min

题意

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

思路

首先,如果 m 是 0,结果肯定为 0;如果 m == n,与完也应该是本身。

然后如果 n 的二进制位数 比 m 的二进制位数 多,那么肯定是 0,因为

00001xxxxxx // m 是这样的
00010000000 // 范围内必然存在这样的

这俩一与直接变成 0,所以结果必然是 0。

最后如果 m 和 n 的二进制位数是一样的(因为相同的情况已经判断完了,所以到这里 n 大于 m),可以找到 m 和 n 的二进制最高的相同位的一对 0 1,将这一位及它后面的所有位的数全变为 0,即是答案。因为既然位数相同,则必然高位的部分的数字应该是相同的(起码最高位的1应该是一样的),像这样

00001010110 `0` xxxxxxxxxx // m
00001010110 `1` 0000000000 // 范围内必然存在这样的
00001010110 `1` xxxxxxxxxx // n

那个范围内必然存在的数和 m 一与,最高位的一对 0 1 及其后面的数字就全是 0 了,并且高位的数字不会变,所以答案就是把最高位的 0 1 和它后面的数字全变成 0,保留相同的高位数字就是了。

时间复杂度: O ( l o g n ) O(logn) O(logn),n 的二进制位数

AC代码

class Solution {
public:
    int number_binary_digit(int x) {
        int res = 0;
        while(x) {
            res++;
            x >>= 1;
        }
        return res;
    }
    int rangeBitwiseAnd(int m, int n) {
        if(m == 0) return 0;
        if(m == n) return m;
        
        int num_m = number_binary_digit(m);
        int num_n = number_binary_digit(n);
        if(num_n > num_m) return 0;
        
        int pos = 0;
        for(int i = 0, tmp_m = m, tmp_n = n; tmp_m; tmp_m>>=1, tmp_n>>=1, ++i) {
            int m1 = tmp_m&1;
            int n1 = tmp_n&1;
            if(m1 != n1) pos = i;
        }
        int ans = m;
        ans >>= pos;
        ans <<= pos;
        return ans;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【leetcode】201. 数字范围按位与(bitwise-and-of-numbers-range)(位运算)[中等] 的相关文章

  • 如何在ios上正确格式化货币

    我正在寻找一种在不使用 TextField hack 的情况下将字符串格式化为货币的方法 例如 我想将数字 521242 转换为 5 212 42 或者 如果我有一个低于 1 美元的数字 我希望它看起来像这样 52 gt 0 52 Than
  • React.js控制文本光标焦点问题

    我有一个简单的数字类型受控输入 如下所示
  • 在不同的输入文本上生成随机数并确保显示的随机数是唯一的

    我正在尝试使用 JQuery 创建一个 JavaScript 代码段 该代码段具有不断变化的随机数 并将显示在不同的文本框中 但是 我不知道如何使每个文本框的数字显示不同的值 我怎样才能做到这一点 这是到目前为止我的 JavaScript
  • C++ - 如何找到整数的长度

    我试图找到一种方法来查找整数的长度 位数 然后将其放入整数数组中 该作业还要求在不使用 STL 中的类的情况下执行此操作 尽管程序规范确实说我们可以使用 通用 C 库 我会问我的教授是否可以使用 cmath 因为我假设 log10 num
  • Oracle 12c - “number”列上的索引比“varchar”列上的索引执行得更快吗?

    假设我在 Oracle 12c 中有一个表 其中包含以下列 create table t1 a number 5 0 b varchar 5 0 d e 然后我在具有相同值的两列中插入 100 000 000 条记录 例如 20151 an
  • 如何在 APL 中将数字拆分为数字

    在 APL 中 如何将整数或数字拆分为包含其数字的向量 最简洁 最短 的方法是什么 您可以使用反函数Decode以 10 为底 10 1 since Decode将接收所需数量的数字并对其进行解码 其逆函数将接收一个数字并将其编码为所需数量
  • Rails 中数字的本地化

    对新帖子感到抱歉 但我的第一个帖子关注的是阿拉伯 波斯数字 但问题似乎更大 我想知道是否有人做了一个 gem 来处理 ruby rails 中数字的本地化 I18n 官方语言环境 https github com svenfuchs rai
  • 从 NXC 中的文件返回负值

    我将值保存到 NXC 不是 eXactly C 中的 csv 文件 然后在稍后的时间点调用它们 我遇到的问题是 当从单元格中调用任何负值时 它会显示为 0123 而不是 123 这会导致我所有的额外计算失败 当前的代码是 OpenFileR
  • 为什么我不应该对 TD(表格单元格)上的数字使用已弃用的align='right'?

    我指的是用于显示表格数据的表格的用法 例如 电子表格 重点关注numbers 我感觉并在用户体验中查看 https ux stackexchange com a 24073应该右对齐 格式正确 具有相同的小数位数 以方便求和 对于数字来说
  • 使用扫描仪继续读取数字,直到到达换行符

    我想从控制台读取几个数字 我想要做到这一点的方法是让用户输入一系列由空格分隔的数字 代码执行以下操作 Scanner sc new Scanner System in while sc hasNextInt int i sc nextInt
  • PHP 在单位数字之前预先添加前导零,动态 [重复]

    这个问题在这里已经有答案了 PHP 是否有一种快速 即时的方法来测试单个字符串 然后在前面添加前导零 Example year 11 month 4 stamp year add single zero if needed month Im
  • 在c中获取浮点数的指数

    抱歉 如果已经有人问过这个问题 并且我已经看到了提取浮点数指数的其他方法 但这就是给我的 unsigned f2i float f union unsigned i float f x x i 0 x f f return x i 我无法理
  • 将 pandas 中的数字格式化为以千或百万为单位的货币

    我有一个数据框 pd DataFrame Amount 19000000 9873200 823449242 我需要将数字转换为以百万计的货币 即 19 00MM 9 88MM 和 823 45MM 有谁知道一个快速的方法来做到这一点 Th
  • 创建后缀号码球拍

    我正在尝试在 Racket 中试验我可以做的事情 并且我想在数字后加上字母 对于这个例子 我只想代表10000 as 10K and 1000000 as 1M 有没有办法 用宏或其他方式 我可以扩展1M to 1 1000000 或者有什
  • 对包含数字和字符串的数组进行排序

    我正在尝试对包含字符串 数字和数字作为字符串 例如 1 2 的数组进行排序 我想对这个数组进行排序 以便排序后的数组首先包含数字 然后包含包含数字的字符串 最后包含字符串 var arr 9 5 2 ab 3 1 to be sorted
  • 添加一个新列,其中标签附加到新月形数字

    我想添加一个新列 给出一个常量标签 并逐行附加新月数字逻辑 我的输入 position work chr1 jil2001 chr4 jil2001 chr3 kou2009 chr9 nai2012 chr7 fandis2005 我的预
  • Android 软键盘先显示数字视图

    我的应用程序上有一个登录屏幕 它接受 CPF 作为登录名 CPF 是每个巴西公民都有的唯一号码标识 例如 10546819546 但它也可以接受护照号码作为登录名 并且上面可能有字母 我的问题是我希望键盘在弹出时在默认字母表之前显示数字 符
  • 将 Pi 转换为字母?

    对于 Pi Day 我正在尝试编写一个 Java 程序 尝试在 Pi 中找到给定的单词 或另一个给定的无理数 我几乎已经完成了所有工作 但我对如何将 pi 的每个数字转换为字母感到矛盾 我想说 A 01 B 02 C 03 Y 25 Z 2
  • 需要从数组中删除字符串[重复]

    这个问题在这里已经有答案了 我在 for 循环中有一个数组 如下所示 var arr abc 5 city 2 area 2 max choice 我只需要这样的数字 var arr 5 2 2 有人可以在这里帮忙吗 另一种方法是使用转换后
  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t

随机推荐