Scalaで解決しようとしている別のcodechefの問題に遭遇しました。問題文は次のとおりです。
ステップフォード通りは行き止まりの通りでした。ステップフォード ストリートの家は、裕福な億万長者によって購入されました。彼らは、通りに沿って進むにつれて、建物の高さが急速に増加するように、それらを大幅に変更しました。ただし、すべての億万長者が平等に作成されたわけではありません。この傾向に従うことを拒否し、家を元の高さに保つ人もいました。結果として生じる高さの進行はかくして妨げられた。ビバリーヒルズ市営企業は、最も注文の多い通りを特定するコンテストを発表しました。最も秩序のある通りの基準は次のように設定されました: 検討中の家よりも通りの後ろに高さが低い家が存在する場合、そのペア (現在の家、後の家) は無秩序指数の 1 点としてカウントされます。ストリート。後の家が現在の家に隣接している必要はありません。注: 通りにある 2 つの家が同じ高さになることはありません。たとえば、入力の場合: 1 2 4 5 3 6 ペア (4,3)、(5,3) は無秩序なペアを形成します。したがって、この配列の無秩序性指数は 2 です。無秩序性を判断するための基準は複雑であるため、BHMC はプロセスを自動化するためにあなたの助けを求めています。道路の無秩序指数を計算する効率的なプログラムを作成する必要があります。
入力出力の例は次のとおりです。
入力: 1 2 4 5 3 6
出力: 2
(4,3) と (5,3) の 2 つのペアのため、出力は 2 です。
この問題を解決するには、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)
}
}
まず、私のロジックが間違っています。マージ段階がなく、ベースケースの結果をスタックに浸透させて他の値と比較する最良の方法が何であるかわかりません。また、この問題を解決するために再帰を使用することは、最適な方法ではない可能性があります。大きなリストの場合、スタックを爆破する可能性があるからです。また、私のコードにもスタイル上の問題がある可能性があります。
誰かが他の欠陥とこの問題を解決する正しい方法を指摘できれば幸いです.
ありがとう