我遇到了另一个我试图在 Scala 中解决的codechef 问题。问题陈述如下:
Stepford Street是一条死胡同。Stepford Street 上的房子被富有的百万富翁买下。他们对它们进行了广泛的改造,以便随着沿街的推进,建筑物的高度迅速增加。然而,并非所有的百万富翁都是生来平等的。一些人拒绝跟随这一趋势,并将他们的房屋保持在原来的高度。因此,由此产生的高度进展受到干扰。比佛利山庄市政公司宣布了一场寻找最有序街道的竞赛。最有序街道的标准设置如下:如果街道中存在比所考虑的房子高度低的房子,那么这对(当前房子,后来的房子)计入 1 分的无序度指数街道。后面的房子不必与现在的房子相邻。注意:一条街道上没有两栋房子的高度相同 例如,对于输入:1 2 4 5 3 6 对 (4,3), (5,3) 形成无序对。因此该数组的无序度指数为 2。由于确定无序度的标准很复杂,BHMC 已请求您帮助自动化该过程。你需要编写一个高效的程序来计算街道的无序度指数。
提供的示例输入输出如下:
输入:1 2 4 5 3 6
输出:2
输出为 2 因为有两对 (4,3) 和 (5,3)
为了解决这个问题,我认为我应该使用 MergeSort 的变体,当左元素大于右元素时递增 1。
我的scala代码如下:
def dysfunctionCalc(input:List[Int]):Int = {
val leftHalf = input.size/2
println("HalfSize:"+leftHalf)
val isOdd = input.size%2
println("Is odd:"+isOdd)
val leftList = input.take(leftHalf+isOdd)
println("LeftList:"+leftList)
val rightList = input.drop(leftHalf+isOdd)
println("RightList:"+rightList)
if ((leftList.size <= 1) && (rightList.size <= 1)){
println("Entering input where both lists are <= 1")
if(leftList.size == 0 || rightList.size == 0){
println("One of the lists is less than 0")
0
}
else if(leftList.head > rightList.head)1 else 0
}
else{
println("Both lists are greater than 1")
dysfunctionCalc(leftList) + dysfunctionCalc(rightList)
}
}
首先,我的逻辑是错误的,它没有合并阶段,我不确定将基本情况的结果渗透到堆栈中并将其与其他值进行比较的最佳方法是什么。此外,使用递归来解决这个问题可能不是最好的方法,因为对于大型列表,我可能会炸毁堆栈。此外,我的代码也可能存在风格问题。
如果有人能指出其他缺陷和解决这个问题的正确方法,我会很棒。
谢谢