Java 如何将元素1与数组的0(仅由1和0组成)交换,以便所有1都在一起
如何解决以下编程问题 存在一个仅由0和1按随机顺序组成的数组。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交
例如,考虑下面的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都已经结束了。