我想解决从scala中的codechef翻转硬币问题。问题陈述如下:使用斯卡拉翻转硬币
有N个硬币保留在表中,编号为0至N - 1 Initally,每个硬币保持尾部向上。您必须执行两种类型的 操作:1)翻转编号在A和B之间的所有硬币。这是由命令“0 A B”表示的 2)回答A和B之间有多少枚编号为 的硬币抬头。这由命令“1 A B”表示。输入:第一行包含两个整数N和Q.接下来的Q行中的每一行都是上面提到的 中提到的“0 A B”或“1 A B”形式。
输出:对于形式为“1 A B” 的每个查询输出1行,其中包含相应查询所需的答案。
样品输入:
4 7
1 0 3
0 1 2
1 0 1
1 0 0
0 0 3
1 0 3
1 3 3
样本输出:
0
1
0
2
1
限制条件:1 < = N < = 100000 1 < = Q < = 100000 0 < = A < = B < = N - 1
在最简单的方法,想到在阶初始化整数数组的如下:
var coins = new Array[Int](1000)
如果我遇到命令0 AB,我将简单地A的索引设定直到B + 1到1如下:
for(i <- 5 until 8){
coins(i) = 1
}
如果我遇到命令1 AB,我将在阵列的切片从A到B + 1和计数的数目1在那个给定的切片和我将在下面做:
val headCount = coins.slice(5,8).count(x => x == 1)
这样看来,操作采取为O(n)在最坏的情况下,显然这可以优化在对数时间来解决。
有人可以指出我可能在这里做错了什么,以及如何以最优方式解决这个问题。
由于
而不是数组来存储头可以找到的间隔。请参阅间隔树wiki文章,了解如何实现您的功能。 – ElKamina
@Elkamina - 谢谢。也许在scala中实现间隔树会适用于这种特殊情况。需要阅读更多的内容。 –