原题
面试题05.04.下一个数
题解
方法一 暴力法(代码通过但是很多手输实例超时)
本方法就是从给定的数字num两侧分别开始找比特数域num相同的数,每一边找到就立刻停止寻找。 本思路java代码示例:
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
};
}
}
方法二 筛选(仍有个别测试例超时)
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;
}
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-42529.html