正整数N内的二进制间隙是连续的零的任何最大序列,在N的二进制表示形式的两端都被一个1包围。
例如,数字9的二进制表示形式为1001,并且包含长度为2的二进制间隙。数字529的二进制表示形式为1000010001,并且包含两个二进制间隙:长度为4的一个长度为3。数字20为二进制表示的。 10100,包含一个长度为1的二进制间隙。数字15具有二进制表示1111,没有二进制间隙。数字32的二进制表示形式为100000,没有二进制间隔。
编写函数:
class Solution {public int solution(int N); }
给出正整数N的返回其最长二进制间隙的长度。如果N不包含二进制间隔,则函数应返回0。
例如,给定N = 1041,该函数应返回5,因为N具有二进制表示形式10000010001,因此其最长二进制间隙为长度5。给定N = 32,该函数应返回0,因为N具有二进制表示形式'100000 ',因此没有二进制间隙。
为以下假设写出有效的算法:
N是[1..2,147,483,647]范围内的整数。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution s = new Solution();
int x = s.solution(1041);
System.out.println(x);
}
}
class Solution {
public int solution(int N)
{
int countZero = 0;
Integer maxCountZeroList = 0;
List<Integer> countZeroList = new ArrayList<Integer>();
String nBin = Integer.toBinaryString(N);
for (int i=1;i<nBin.length();i++) {
if(nBin.charAt(i) == '1')
{
countZeroList.add(countZero);
countZero = 0;
}
else
{
countZero++;
}
}
if(countZeroList.size() > 0)
{
maxCountZeroList = Collections.max(countZeroList);
}
return maxCountZeroList;
}
}
我正在寻找解决此问题的更有效方法