Java 查找二进制数字数组中最长的一系列

Java 查找二进制数字数组中最长的一系列,java,regex,algorithm,Java,Regex,Algorithm,我如何在这个二进制数字数组中找到最长的一系列数字-1000111011001111110011100 在这种情况下,答案应该是=11111 我想在数组中循环并检查每个数字,如果数字是1,则将其添加到新字符串中,如果是零,则重新开始创建新字符串,但保存以前创建的字符串。完成后,检查每个字符串的长度,以查看哪个字符串最长。我确信有一个更简单的解决方案?以下是一些伪代码,它们可以实现您想要的功能: count = 0 longestCount = 0 foreach digit in binaryDi

我如何在这个二进制数字数组中找到最长的一系列数字-1000111011001111110011100

在这种情况下,答案应该是=11111


我想在数组中循环并检查每个数字,如果数字是1,则将其添加到新字符串中,如果是零,则重新开始创建新字符串,但保存以前创建的字符串。完成后,检查每个字符串的长度,以查看哪个字符串最长。我确信有一个更简单的解决方案?

以下是一些伪代码,它们可以实现您想要的功能:

count = 0
longestCount = 0
foreach digit in binaryDigitArray:
   if (digit == 1) count++
   else:
      longestCount = max(count, maxCount)
      count = 0
longestCount = max(count, maxCount)

更容易的方法是提取1的所有序列,按长度排序,然后选择第一个。但是,根据所使用的语言,它可能只是我建议的一个简短版本。

您的算法很好,但是您不需要保存所有临时字符串,它们都是“一”

您只需要有两个变量“bestStartPosition”和“bestLength”。找到“一”序列后,将该序列的长度与保存的“bestLength”进行比较,并用新的位置和长度覆盖这两个变量


扫描完所有数组后,您将获得最长序列的位置(如果需要的话)和长度(通过该长度可以生成一个“1”字符串)。

获得了一些仅用于php的预览代码,也许您可以重写为您的语言

这将说明1的最大长度是多少:

$match = preg_split("/0+/", "100011101100111110011100", -1, PREG_SPLIT_NO_EMPTY);
echo max(array_map('strlen', $match));
结果:

 5

Java 8更新具有O(n)时间复杂性(仅1行):

这也会自动处理空白输入,在这种情况下返回
0


Java 7紧凑型解决方案,但O(n log n)时间复杂度:

让java API在3行代码中为您完成所有工作:

String bits = "100011101100111110011100";

LinkedList<String> list = new LinkedList<String>(Arrays.asList(bits.split("0+")));
Collections.sort(list);
int maxLength = list.getLast().length(); // 5 for the example given

当然,但前提是你没有一个二进制数字数组。仅供参考,我刚刚在这里发布了一个更有效的算法:。它是用Ruby编写的,但很容易修改。看起来不错,但对于这样一个简单的任务来说,CPU和内存消耗过多。至少可以通过编写“/0+/”而不是“/0/”来优化它。将导致更少的拆分。您可以通过使用
Arrays.sort()
@Max来简化它。我喜欢它-请参见编辑!(但令人失望的是,它并没有紧凑得多)好吧,您可以将代码堆叠在一行中,使其更“紧凑”:我喜欢它,这一行的时空复杂度是多少?@jalal time complexity是O(n log n),这是由于排序,但我添加了一个O(n)且更优雅的Java 8解决方案。
String bits = "100011101100111110011100";

LinkedList<String> list = new LinkedList<String>(Arrays.asList(bits.split("0+")));
Collections.sort(list);
int maxLength = list.getLast().length(); // 5 for the example given
String[] split = bits.split("0+");
Arrays.sort(split);
int maxLength = split[split.length - 1].length();