leetcode刷题笔记 二百零一题 数字范围按位与
源地址:201. 数字范围按位与
问题描述:
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
输入: [5,7]
输出: 4
示例 2:输入: [0,1]
输出: 0
//因为是对区间内所有数字进行与操作, 一旦出现对应位置不相同,在区间内所有数求与的过程中肯定为0
//按照这个思路,就将问题转化为最长公共二进制前缀
object Solution {
def rangeBitwiseAnd(m: Int, n: Int): Int = {
var count = 0
var num1 = m
var num2 = n
while (num1 < num2){
num1 = num1 >>> 1
num2 = num2 >>> 1
count += 1
}
return num1 << count
}
}
//也可以借用之前的技巧 n & n-1 去除最右边的1
//有题目条件易知, m <= n
//通过不断对大数不断去除右边1,达到和m 01位置一致,实现最长公共二进制前缀
object Solution {
def rangeBitwiseAnd(m: Int, n: Int): Int = {
var count = 0
var num1 = m
var num2 = n
while (num1 < num2){
num2 = num2 & (num2-1)
}
return num2
}
}