leetcode刷题笔记 二百零一题 数字范围按位与

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
    }
}
posted @ 2020-09-21 16:12  ganshuoos  阅读(112)  评论(0编辑  收藏  举报