HackerEarth的以下逻辑或算法是什么?

时间:2017-06-19 14:23:48

标签: algorithm

黑客喜欢比特,亚历克斯也是如此。亚历克斯刚刚开始他的黑客职业生涯,并发现了一个特殊的二进制数组 一个 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

2 个答案:

答案 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审核我的算法。

希望这有帮助!