一部が複数回繰り返される要素のリストが与えられた場合、タプルを含む新しいリストを作成する必要があります。各タプルには、要素が1行で繰り返される回数と要素自体が含まれます。
たとえば、与えられた
println(func(List())) // should be empty list
println(func(List(1, 1))) // (2,1) <- 1 is repeated 2 times
println(func(List(1, 1, 2, 1))) // (2,1)(1,2)(1,1)
これは、現時点での私の最善の試みです。私は非常に基本的なものが欠けていると感じています、私が何を理解するのを手伝ってください
def func[X](xs: List[X]): List[(Int, X)] = xs match {
case Nil => Nil
case y :: ys => ys match {
case Nil => (1, y) :: Nil
case z :: zs => if (y != z) (ys.prefixLength(_ == ys.head), y) :: func(ys)
else func(ys)
}
}
問題が何であるかを分析した後、私が再帰的に呼び出す時点では、要素の数を把握するのに十分な情報がないように思われfunc(ys)
ますys
。を扱っているとしましょうList(1,1,1,2)
。わかりました、そうです、 y
です1
、z
です1
、そして(1::(2::Nil))
ですzs
。上記の私の論理に従うと、1が2回見られたという事実は、次の呼び出しで失われます。
問題は、私が問題について正しい方法で考えていないことかもしれません。私が念頭に置いているのは、「この要素が前の要素と同じではないことがわかるまでリストに沿って進み、その時点で、要素の出現回数を数えてタプルにする」ということです。
上記のシナリオ(私のコード)では、問題は、数字が実際に同じである場合(1,1)、すでに数字を見たという事実がどこにも反映されていないことを認識しています。しかし、タプルを作成する準備がまだできていないので、どこでこれを行うことができますか?
この質問に答える際には、ケースの構造に固執してください。この問題に対処するための他のより良い、よりクリーンな方法があるかもしれないことを私は理解しています、私はここで私が間違っていることをよりよく理解したいと思います