博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode----201. Bitwise AND of Numbers Range
阅读量:4113 次
发布时间:2019-05-25

本文共 1171 字,大约阅读时间需要 3 分钟。

链接:

大意:

给定两个数m,n。满足:0 <= m <= n <= Integer.MAX_VALUE。要求求出区间[m,n]所有数依次与运算的结果。例子:

思路:

首先判断几种特殊情况:

  • m == 0,则可以直接返回m(0)
  • m == n,也可以直接返回m。因此和上一种情况可以合并
  • m < n && n = 2 ^ x(即n为2的次方幂),此时可以直接返回0

除了上述的特殊情况外,其余情况就老老实实求吧...(后来发现可以解决,但是效率极低)

代码:

class Solution {    public int rangeBitwiseAnd(int m, int n) {        if (m == 0 || m == n)            return m;        // m < n && n = 2 ^ x        if ((n & (n - 1)) == 0)            return 0;        // m < n && n != 2 ^ x        int res = Integer.MAX_VALUE;        while (m <= n) {            res = res & m & n;            if (res == 0)                return 0;            m++;            n--;        }        return res;    }}

结果:

结论:

时间效率确实低。。。需要改进

改进:

class Solution {    public int rangeBitwiseAnd(int m, int n) {        if (m == 0 || m == n)            return m;        // m >= 1 并且 n > m(即 n > 1) 若(m,n]中有一个数为2^x,则返回0        long r = 1; // r为一个2的幂次方数 使用long解决1左移31位溢出的问题        while ((r << 1) <= n) {            if ((r << 1) > m)                return 0;            r <<= 1;        }        // 能走到这 表明[m,n]肯定没有跨区间 如:[5,7] 而[5,9]则为跨区间 既然没跨区间 则对应与运算结果在该位置的二进制数肯定为1        return (int)r + rangeBitwiseAnd(m - (int)r, n - (int)r);    }}

 

转载地址:http://faesi.baihongyu.com/

你可能感兴趣的文章
查找最大值最小值
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
python猜拳游戏
查看>>
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
ESP8266 WIFI数传 Pixhaw折腾笔记
查看>>
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
element ui 弹窗在IE11中关闭时闪现问题修复
查看>>
vue 遍历对象并动态绑定在下拉列表中
查看>>
Vue动态生成el-checkbox点击无法选中的解决方法
查看>>
python __future__
查看>>
MySQL Tricks1
查看>>
python 变量作用域问题(经典坑)
查看>>
pytorch
查看>>
pytorch(二)
查看>>