我的Binary Gap代码解决方案是否正确? 我应该改进什么?

正整数N内的二进制间隙是连续零的任何最大序列,其由N的二进制表示中的两端的1包围。

例如,数字9具有二进制表示1001并且包含长度为2的二进制间隙。数字529具有二进制表示1000010001并且包含两个二进制间隙:长度为4且长度为3的一个。数字20具有二进制表示10100并包含一个长度为1的二进制间隙。数字15具有二进制表示1111并且没有二进制间隙。

写一个函数:

int solution(int N); 在给定正整数N的情况下,返回其最长二进制间隙的长度。 如果N不包含二进制间隙,则该函数应返回0。

例如,给定N = 1041,函数应返回5,因为N具有二进制表示10000010001,因此其最长的二进制间隙长度为5。

public int solution(int n) { // write your code in Java SE 8 String binaryRep = Integer.toBinaryString(n); System.out.println("Binary Representation of " + n + " = " + binaryRep); List strList = new ArrayList(); int count = 0; for (int i = 0; i < binaryRep.length(); i++) { // Loop through the each number String str = binaryRep.charAt(i) + ""; // getting one by one number if(str.equals("0")){ for(int j = i;j= strList.size()){ strList.add(str1); }else if(strList.isEmpty()){ strList.add(str1); } count ++; }else{ count = 0; break; } } } } return strList.size(); } 

我还没有测试过您的代码,但如果您的目标只计算最长的“二进制差距”,那么效率似乎非常低效。

代码中的问题:

  • java.lang.String可以只是char时使它成为。 制作对象比制作基本类型要慢得多。
  • 当它能够简单计数时制作一个列表。 只要您只需要列表的大小,就可以在整数变量中计算它。
  • 愚蠢的算法。 字符串的子字符串不能长于原始字符串。 我在谈论第二个for循环。 例如,假设您计算的是1001二进制间隙。 然后你的算法算二进制间隙为001 ,然后是01 。 您根本不需要计算第二个。 它正在发生,因为你有两个for循环。

最大的问题是,没有将int转换为java.lang.String就可以解决这个问题。 如果你从教科书中得到这个问题,我相信这是’正确的’答案:使用按位运算符。

 public static int solution(int num) { int ptr; //Used for bitwise operation. for(ptr=1; ptr>0; ptr<<=1) //Find the lowest bit 1 if((num&ptr) != 0) break; int cnt=0; //Count the (possible) gap int ret=0; //Keep the longest gap. for(; ptr>0; ptr<<=1) { if((num&ptr) != 0) { //If it's bit 1 ret = cnt < ret ? ret : cnt; //Get the bigger one between cnt and ret cnt=-1; //Exclude this bit } cnt++; //Increment the count. If this bit is 1, then cnt would become 0 beause we set the cnt as -1 instead of 0. } return ret; } 

不需要将二进制字符串的内容放入数组中(除非这是必需的),只需遍历字符串本身并使用String.substring()方法检索每个二进制数字的字符串表示值,如:

 String digit = binaryString.substring(i, i+1); 

这一切都归结为计算任何1组之间的0的数量,并通过使用每次遇到0时递增的Integer数据类型变量来跟踪那些0。 每次遇到1都会将此相同的变量重置为0,但在重置之前,您会将其与另一个预定义的Integer变量进行比较,该变量将保持遇到的最长0次运行,例如:

 if(binaryString.substring(i, i+1).equals("1")) { if (zeroHit > longest) { longest = zeroHit; } zeroHit = 0; } else { zeroHit++; } 

整个方法看起来像这样:

 private static int solution(int intValue) { String binaryString = Integer.toBinaryString(intValue); int zeroHit = 0; int longest = 0; for (int i = 0; i < binaryString.length(); i++) { if(binaryString.substring(i, i+1).equals("1")) { if (zeroHit > longest) { longest = zeroHit; } zeroHit = 0; } else { zeroHit++; } } return longest; } 

这是我的谦虚解决方案。 现在我看到它看起来像修改DevilsHnd的答案。 我测试了它

 public int countZeros(int n) { String binaryRep = Integer.toBinaryString(n); char[] nChars = binaryRep.toCharArray(); int nElemLength = Math.min(binaryRep.lastIndexOf('1') + 1, nChars.length); if (nElemLength <= 2) { return 0; } String[] elementsParts = binaryRep.substring(0, nElemLength).split("1"); int zeroLength = 0; for (String elementsPart : elementsParts) { if (elementsPart.length() > zeroLength) { zeroLength = elementsPart.length(); } } return zeroLength; } 

这个算法怎么样? 对时间表现不好还是不好?

 int count = 0, prevCount = 0; while (a > 1) { if (a % 2 == 0) { count++; if (count > prevCount) prevCount++; } else { count = 0; } a = a/2; } if(a % 2 == 0) prevCount++; 

我认为你的代码有点令人困惑,请检查一下。

 public int solution(int n) { if (n <= 0) return 0; char[] chars = Integer.toBinaryString(n).toCharArray(); ArrayList arrayList = new ArrayList<>(); int maxCount = 0; for (int i = 0; i < chars.length; i++) { while (chars[i] == '0' && i + 1 < chars.length) { maxCount++; i++; if (i + 1 == chars.length && chars[i] == '0') maxCount = 0; } if (maxCount != 0) arrayList.add(maxCount); maxCount = 0; } return arrayList.isEmpty() ? 0 : Collections.max(arrayList); } 

嗨,这是我完成这项任务的解决方案。 我有任务分数:100%正确率:100%

 public int solution(int N) { String binary = Integer.toBinaryString(N); int[] table = new int[binary.length()]; for (int i=0;i res){ res = resu; } resu = 0; }else { resu++; } } return res; } 

为了所有人的利益,这是我对二进制差距的解决方案,它让我100%获得任务分数和任务正确性:

 class Solution { public int solution(int N) { String nStr = Integer.toBinaryString(N); boolean isCounting = false; int j=0; int[] seqs = new int[32]; for (int i=0; i maxGap) maxGap = seqs[k]; return maxGap; } }