【Leetcode】Bitwise AND of Numbers Range

本文介绍了一道LeetCode上的编程题——范围内的按位与运算。针对给定的两个整数m和n(0≤m≤n≤2^31-1),返回此区间内所有数字的按位与结果。通过分析32位整数的特点,提出了一种高效的解决方案。

题目链接:https://leetcode.com/problems/bitwise-and-of-numbers-range/

题目:

Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.

For example, given the range [5, 7], you should return 4.

思路:

32位整型,只需判断每一位在m~n之间是否有0存在,若有,该位 在AND操作中一定为0,只需判断32次

算法

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public int rangeBitwiseAnd(int m, int n) {  
  2.         if (m == n)  
  3.             return m;  
  4.         int res = 0, i = 0;  
  5.         while (n != 0 && m != 0) {  
  6.             // 检查m~n是否有偶数存在时间复杂度O(1)  
  7.             boolean flag = false;  
  8.             for (int j = m; j <= n; j++) {  
  9.                 int tmp = j;  
  10.                 if ((tmp & 1) == 0) {// 最后一位为0  
  11.                     flag = true;  
  12.                     break;  
  13.                 }  
  14.             }  
  15.   
  16.             if (flag == false) {// 最低位全是1  
  17.                 res = res | (1 << i); // 将指定为置为1  
  18.             }  
  19.             i++;  
  20.             n = n >> 1;  
  21.             m = m >> 1;  
  22.         }  
  23.         return res;  
  24.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值