Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 如何将元素1与数组的0(仅由1和0组成)交换,以便所有1都在一起_Java_Arrays - Fatal编程技术网

Java 如何将元素1与数组的0(仅由1和0组成)交换,以便所有1都在一起

Java 如何将元素1与数组的0(仅由1和0组成)交换,以便所有1都在一起,java,arrays,Java,Arrays,如何解决以下编程问题 存在一个仅由0和1按随机顺序组成的数组。1的位置可与0的任何位置切换。使所有1都在一起所需的最小掉期数量是多少 解决这个问题的最佳方法是什么。我甚至不能想出暴力的方法 例如,考虑下面的ARAYEL索引,从0 开始 数组大小14 1 0 0 1 0 1 0 0 0 1 第一次传递0 0 0 1 1 0 1 0 0 0 1后,索引0与索引5交换 第二次通过0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0后,索引7与索引13交

如何解决以下编程问题

存在一个仅由0和1按随机顺序组成的数组。1的位置可与0的任何位置切换。使所有1都在一起所需的最小掉期数量是多少

解决这个问题的最佳方法是什么。我甚至不能想出暴力的方法

例如,考虑下面的ARAYEL索引,从0

开始 数组大小14 1 0 0 1 0 1 0 0 0 1

第一次传递0 0 0 1 1 0 1 0 0 0 1后,索引0与索引5交换

第二次通过0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0后,索引7与索引13交换


需要两次交换才能将所有1组合在一起

首先,计算1的数量,我们称之为k。这可以在一天之内完成

接下来,遍历数组,计算k和n之间每个索引i的尾部k个元素之和。这也可以通过使用前一个元素的和加上当前值减去位置i-k处的值来实现

交换的数量等于k-maxsum

在你的例子中,k是5。k-和如下所示:

1 0 0 0 1 0 1 0 1 0 0 0 0 1
- - - - 2 1 2 2 3 2 2 1 1 1
最高金额为3,因此互换数量为5-3=2

注:该算法的直观原理很简单:总和最高的位置是组合在一起的1的运行即将结束的位置,因为在k个索引块中,1的浓度最高。这是您将复制1s的位置,您需要复制k-max剩余1s。

无交换

size = count the size
n = count the one's 
print n '1's
print (size - n) '0's

你什么都想不出来,现在我们帮你做家庭作业?对不起,这正是问题的内容,不是家庭作业。我实际上在一家公司工作。我只是想提高我解决问题的能力:@GhostCat:如果我问这样的问题,我会对谷歌搜索的几个关键词感到满意。听起来不错,但有点神奇。有没有更严谨地解释算法思想的参考资料?@9000老实说,我不知道这个解决方案有什么神奇之处。本质上,它在数组中找到一个范围,其中1的最高计数可以保持不受干扰,并声明这就是剩余1需要复制到的范围。通过假设另一个位置更好,并且观察到任何其他位置都需要更多的交换,很容易看出此解决方案是最优的。有趣的是。你得到的比你在其他评论中提到的谷歌关键词多得多,但仍然不够。如果你想学东西,为什么不坐下来,在接下来的几个小时里思考这些输入呢?而不是立即要求更多的帮助?顺便说一句:利希特先生-很好的回答。dasblinkenlight:虽然这个想法很清楚,但证明答案准确的证据可能很容易留给读者。我只是希望这是一个已知的问题,并且已经有一个页面解释了细节。那么这如何告诉你这个案例的答案是2?这是n次交换。想象一下,所有的1都已经结束了。