如何找到这个二进制数字数组中最长的一系列 - 100011101100111110011100
在这种情况下,答案应为= 11111
我正在考虑循环遍历数组并检查每个数字,如果数字为1,则将其添加到新的String中,如果它为零,则重新开始创建新的String但保存先前创建的String。完成后检查每个String的长度,看哪个是最长的。我确定有一个更简单的解决方案吗?
答案 0 :(得分:4)
你的算法很好,但你不需要保存所有临时字符串 - 它们都是"那些"反正。
你应该只有两个变量" bestStartPosition"和#34; bestLength"。找到一系列"" - 您将此序列的长度与保存的" bestLength"进行比较,并用新的位置和长度覆盖这两个变量。
扫描完所有数组后 - 您将获得最长序列的位置(如果需要)和长度(通过该长度可以生成一串"那些")。
答案 1 :(得分:3)
这是一些应该做你想做的伪代码:
count = 0
longestCount = 0
foreach digit in binaryDigitArray:
if (digit == 1) count++
else:
longestCount = max(count, maxCount)
count = 0
longestCount = max(count, maxCount)
更容易提取1的所有序列,按长度排序并选择第一个。但是,根据使用的语言,它可能只是我建议的简短版本。
答案 2 :(得分:3)
Java 8更新(并且只有1行):
int maxLength = Arrays.stream(bitStr.split("0+"))
.mapToInt(String::length)
.max().orElse(0);
请参阅live demo。
这也会自动处理空白输入,在这种情况下返回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
这是如何运作的:
bits.split("0+")
将输入分解为String[]
,每个连续的1个链(由全零分隔 - 正则表达式为0+
)成为数组的元素Arrays.asList()
将String[]
变为List<String>
LinkedList
LinkedList
的原因 - 它有一个getLast()
方法,我觉得这很方便对于那些认为“太重”的人来说,在我的MacBook Pro上执行样本输入时花了不到1毫秒。除非您的输入字符串长度为千兆字节,否则此代码将很快执行。
Max建议,使用Arrays.sort()
非常相似并且执行时间只有一半,但仍需要3行:
String[] split = bits.split("0+");
Arrays.sort(split);
int maxLength = split[split.length - 1].length();
答案 3 :(得分:0)
只有php的预览代码,也许你可以用你的语言重写。
这将说明1的最大长度:
$match = preg_split("/0+/", "100011101100111110011100", -1, PREG_SPLIT_NO_EMPTY);
echo max(array_map('strlen', $match));
结果:
5