黑客喜欢比特,亚历克斯也是如此。亚历克斯刚刚开始他的黑客职业生涯,并发现了一个特殊的二进制数组 一个 A(含有 0 小号 和 1 小号 )。
在一个操作中,他可以选择数组中的任意两个位置,并可以交换它们的值。他必须执行一个操作并最大化仅包含子阵列的长度 1 小号
由于Alex是他所在领域的新手,请帮助他,并输出所需的子数组长度 1 小号 1秒。
输入格式:
第一行包含一个整数 N,表示数组中元素的数量。
第二行由N个空格分隔的整数组成,表示数组的元素。
输出格式:
打印仅包含的子数组所需的长度 1 小号 1秒。
输入约束:
1 ≤ N ≤ 100
1 ≤ N ≤ 1000 ≤ A[i] ≤ 1
输入:
5
1 1 1 0 1
输出:
4
答案 0 :(得分:2)
一般算法:
有一个变量inSub,用于跟踪您正在查看的子字符串。它的值最初为-1,表示您没有查看特定的子串atm。
遍历字符串,直到找到1.此1的索引将是inSub的新值。
还有一个变量hitZero(初始化为False),它跟踪当前子串是否遇到零。这是因为假设在整个列表中有另一个零,则可以用一个零替换。如果击中零并且hitZero为False,则变为True。如果hitZero已经为True,则需要将子字符串的长度存储在列表SubList中,inSub将设置为-1,而hitZero将再次为False。
在这结束时,您将有一个子串长度列表。如果列表中有多个子字符串,则答案将是最长的子字符串(因为您可以从其他子字符串中获取一个子字符串)。如果只有一个子字符串,则答案将是子字符串中最长的连续字符串1。 (已编辑)
答案 1 :(得分:0)
让我向您解释一下您可以用什么思维过程来解决这个问题。
每当您发现问题时,请尝试在脑海中提出一些测试用例。
对于这个特殊问题,以下任何一个测试用例都可能是一个很好的起点。
Example 1:-
Input:
1 1 1 1 0 0 0
Output
4
在上面的示例中,您可以清楚地看到没有可能的交换,因此输出将为4.
Example 2:-
Input
1 1 1 1 1 1
Output
6
在上面的例子中也没有交换是可能的,因为没有子串被0分隔,所以你的答案基本上等于整个字符串的长度。
Example 3:-
Input
1 1 1 0 0 0 1 1 1 1
Output
5
在上面的例子中,你可以看到第一个连续字符串中的一个交换,其中一个存在于其他字符串附近的零将给你,你的答案。
所以现在你有三个很好的例子来涵盖大部分角落案例。
查看下面及以上算法的评论,以便更好地了解如何解决此问题。
感谢Carl审核我的算法。
希望这有帮助!