Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定二进制数的间隙长度_Java_Algorithm_Arraylist - Fatal编程技术网

Java 确定二进制数的间隙长度

Java 确定二进制数的间隙长度,java,algorithm,arraylist,Java,Algorithm,Arraylist,我正在尝试做以下练习(在Codibility上找到): 我采用的方法是使用指针。例如,25的二进制表示为11001。我们从i=0,j=1和一个变量gLength=0开始,该变量跟踪间隙的长度 如果第i个索引为1,则检查第j个索引。如果j’th指数为0,则增加gLength。如果j’th指数为1,检查gLength是否大于0。如果是,那么我们需要将该长度存储在ArrayList中,因为我们已经到达了间隙的末端。增加i和j,然后重复 下面是代码中的方法: public static int sol

我正在尝试做以下练习(在Codibility上找到):

我采用的方法是使用指针。例如,25的二进制表示为11001。我们从i=0,j=1和一个变量gLength=0开始,该变量跟踪间隙的长度

如果第i个索引为1,则检查第j个索引。如果j’th指数为0,则增加gLength。如果j’th指数为1,检查gLength是否大于0。如果是,那么我们需要将该长度存储在
ArrayList
中,因为我们已经到达了间隙的末端。增加i和j,然后重复

下面是代码中的方法:

public static int solution(int N) {
    String binaryStr = Integer.toBinaryString(N);
    // pointers
    int i = 0;
    int j = 1;
    // length of gap
    int gLength = 0;

    while (j < binaryStr.length() && i < j) {
        if (binaryStr.charAt(i) == 1) {
            if (binaryStr.charAt(j) == 0) {
                gLength++; // increment length of gap 
            } else if (binaryStr.charAt(j) == 1) {
                // if the digit at the j'th position is the end of a gap, add the gap size to list. 
                if (gLength > 0)
                    gapLengths.add(gLength);
                i++; // increment i pointer
            }
        } else {
            i++; // increment i pointer
        }
        j++; // increment j pointer
    }

    Collections.sort(gapLengths);
    // Line 45 (ERROR)
    int maxGap = gapLengths.get(gapLengths.size() - 1);
    return maxGap;
}
我已经记下了注释中第45行的位置。在进一步调查(使用调试器)之后,我发现我得到了错误,因为
ArrayList
中似乎没有添加长度。有人知道为什么吗

我希望这是明确的,如果没有请让我知道。我不确定这个方法是否会像要求的那样在O(logn)时间内执行,但现在我只想让一些东西工作——然后我会考虑它的时间复杂性

非常感谢你的帮助

问题是
if(binaryStr.charAt(i)==1)
。您正在将
char
int
进行比较

替换:

if (binaryStr.charAt(i) == 1)

与:

if (binaryStr.charAt(i) == '1')

编辑:(正如作者所指出的)

在执行
int maxGap=gapLengths.get(gapLengths.size()-1)之前
,您需要检查
if gapLengths.size()>0
以确保
数组列表中至少有1个元素
问题是
if(binaryStr.charAt(i)==1)
。您正在将
char
int
进行比较

替换:

if (binaryStr.charAt(i) == 1)

与:

if (binaryStr.charAt(i) == '1')

编辑:(正如作者所指出的)


在执行
int maxGap=gapLengths.get(gapLengths.size()-1)之前
,您需要检查
如果gapLengths.size()>0
,以确保
数组列表中至少有1个元素

我不想惹人生气,我认为这些家伙为您的算法提供了很大的帮助。我建议,嗯,我相信这是一个更容易使用的方法

String[] result = binaryStr.split("1");
然后检查数组中最大的元素

编辑:显然我错过了关于大O限制的部分,所以我采用了不同的算法: 如果你看看这一页 你会注意到差距从5(0差距)开始,然后是9(00差距),然后是17(000差距)等等(按递增顺序),我注意到的快速关系是,如果你从5开始,然后加上(5-1=4),你会得到9的00差距,然后9+8=17(000差距)等等


我相信你可能会想出一个固定的计算方法来获得最好的性能,而不必做字符串或字符的工作。

我不想惹人生气,我认为这些家伙为你的算法提供了很大的帮助。我建议,嗯,我相信这是一个更容易使用的方法

String[] result = binaryStr.split("1");
然后检查数组中最大的元素

编辑:显然我错过了关于大O限制的部分,所以我采用了不同的算法: 如果你看看这一页 你会注意到差距从5(0差距)开始,然后是9(00差距),然后是17(000差距)等等(按递增顺序),我注意到的快速关系是,如果你从5开始,然后加上(5-1=4),你会得到9的00差距,然后9+8=17(000差距)等等


我相信您可能能够提出某种固定的计算方法,以获得最佳性能,而无需执行字符串或字符工作。

Swift中的一个简单解决方案:

let number = 5101
let binrygap = String(num, radix:2).componentsSeparatedByString("1").map { (a) -> Int in
a.characters.count}.maxElement()

Swift中的一个简单解决方案:

let number = 5101
let binrygap = String(num, radix:2).componentsSeparatedByString("1").map { (a) -> Int in
a.characters.count}.maxElement()
简单解决方案100%

public int solution(final int N) {

//Convert number to Binary string
String bin = Integer.toString(N, 2);

System.out.println("binary equivalent = " + bin);
int gap = 0;
int maxGap = 0;


for (int i = 1; i < bin.length(); i++) {

  if (bin.charAt(i) == '0') {
    gap++;
  }
  else if (bin.charAt(i) == '1') {

    if (gap > maxGap) {
      maxGap = gap;
    }
    gap = 0;
  }

  }
 return maxGap;
}
公共整数解决方案(最终整数){
//将数字转换为二进制字符串
String bin=Integer.toString(N,2);
System.out.println(“二进制等效=”+bin);
int-gap=0;
int-maxGap=0;
对于(int i=1;i最大间隙){
最大间隙=间隙;
}
差距=0;
}
}
返回最大间隙;
}
简单解决方案100%

public int solution(final int N) {

//Convert number to Binary string
String bin = Integer.toString(N, 2);

System.out.println("binary equivalent = " + bin);
int gap = 0;
int maxGap = 0;


for (int i = 1; i < bin.length(); i++) {

  if (bin.charAt(i) == '0') {
    gap++;
  }
  else if (bin.charAt(i) == '1') {

    if (gap > maxGap) {
      maxGap = gap;
    }
    gap = 0;
  }

  }
 return maxGap;
}
公共整数解决方案(最终整数){
//将数字转换为二进制字符串
String bin=Integer.toString(N,2);
System.out.println(“二进制等效=”+bin);
int-gap=0;
int-maxGap=0;
对于(int i=1;i最大间隙){
最大间隙=间隙;
}
差距=0;
}
}
返回最大间隙;
}

Java 8实现

`


`Java 8实现

`


`
binaryStr.charAt(i)==1
可能不符合您的意愿……注意:您不需要将所有空白都放入列表中;您只需要跟踪最大的一个。我想知道转换为字符串是否违反了空间复杂性要求。将数字转换为二进制字符串需要O(logn)空间;然而,由于N严格限定为2^31-1,因此可以认为空间是由常数限定的。(无需转换为字符串,使用移位)好的建议,干杯。
binaryStr.charAt(i)==1
可能不会达到您的目的…注意:您不需要将所有的间隙都放入列表中;您只需要跟踪最大的一个。我想知道转换为字符串是否违反了空间复杂性要求。将数字转换为二进制字符串需要O(logn)空间;然而,由于N严格限定为2^31-1,因此可以认为空间是由常数限定的。(不需要转换成字符串,也可以使用轮班制)好的建议,干杯。这是一个很好的方法,从来没有想过。出于好奇,你能用这种技术实现O(logn)的运行时间吗?刚刚编辑了我的答案,也许现在它会在性能限制方面给你带来优势,希望这对b有所帮助