前言
今天是位运算的中等题,采用了一种比较笨的思想,1的个数相同,说明最大不会超过2倍,最小也不会小于两倍,直接统计1的个数,在最大最小区间遍历。
题目
源码
class Solution {
public int[] findClosedNumbers(int num) {
int[] res={-1,-1};
long max=(long)num<<1;
int min=num>>1;
int numCount=count(num);
for (int i= num+1;i<=max;++i){//遍历到最大区间
if(numCount==count(i)){
res[0]=i;
break;
}
}
for(int i = num-1;i>=min;--i){//遍历到最小区间
if(numCount==count(i)){
res[1]=i;
break;
}
}
return res;
}
public static int count(int num){//统计1个数
int cnt= 0;
while(num != 0){
num =num &(num-1);
cnt++;
}
return cnt;
}
}