原题
题解
方法一 暴力法(代码通过但是很多手输实例超时)
本方法就是从给定的数字num两侧分别开始找比特数域num相同的数,每一边找到就立刻停止寻找。
本思路java代码示例:
/*
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:36.8 MB, 在所有 Java 提交中击败了100.00%的用户
2020.07.02 14:19
*/
class Solution {
public int[] findClosedNumbers(int num) {
int bit=Integer.bitCount(num);
int da=-1;
int xiao=-1;
for(int i=num+1;i<=Integer.MAX_VALUE;i++){
if(Integer.bitCount(i)==bit){
da=(int)i;
break;
}
}
for(int i=num-1;i>0;i--){
if(Integer.bitCount(i)==bit){
xiao=(int)i;
break;
}
}
return new int[]{da,xiao};
}
}
方法二 筛选(仍有个别测试例超时)
/*
@v7fgg
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:37.1 MB, 在所有 Java 提交中击败了100.00%的用户
2020年7月3日 10:31
*/
class Solution {
public int[] findClosedNumbers(int num) {
int da=-1;
int xiao=-1;
int bit=Integer.bitCount(num);
if(!meida(num)){
for(int i=num+1;i>0;i++){
if(bit==Integer.bitCount(i)){
da=i;
break;
}
}
}
if(!meixiao(num)){
for(int i=num-1;i>0;i--){
if(bit==Integer.bitCount(i)){
xiao=i;
break;
}
}
}
return new int[]{da,xiao};
}
public boolean meida(int num){
int zuida=0;
int i=1073741824;
int j=1;
while(i>0){
zuida+=j;
zuida*=i;
if(num==zuida){return true;}
zuida/=i;
i/=2;
j*=2;
}
return false;
}
public boolean meixiao(int num){
int zuixiao=0;
int i=1;
while(zuixiao<=1073741824){
zuixiao+=i;
if(num==zuixiao){return true;}
i*=2;
}
return false;
}
}
//测试例:1879048191 答案[2013265919,1610612735] 耗时:1819 ms
//测试例:1073741822 答案[1342177279,1073741821] 耗时:1328 ms
//测试例:536870911 答案[805306367,-1] 耗时:1397 ms
//测试例:1073741823 超时