エクササイズ 9 - 45 分
1 から 10,000 までの連番のリストが与えられましたが、それらはすべて順不同です。さらに、リストから欠落している番号が 1 つあります。目標は、どの数字が欠けているかを見つけることです。この問題を解決するための戦略を平易な英語で書き留めてください。できるだけ簡潔にしてください。
この数値のリストを引数として受け取り、欠落している数値を返す Ruby コードを作成します。
1 から 10,000 までの連番のリストが与えられましたが、それらはすべて順不同です。さらに、リストから欠落している番号が 1 つあります。目標は、どの数字が欠けているかを見つけることです。この問題を解決するための戦略を平易な英語で書き留めてください。できるだけ簡潔にしてください。
この数値のリストを引数として受け取り、欠落している数値を返す Ruby コードを作成します。
私の最初の印象は、ある種の並べ替え関数が配列を整理するのに役立つということですが、問題を読み直して、並べ替えられたシーケンスを求めているのではなく、欠落している数字を求めています。考慮すべき次のステップは、次のシーケンスである数字をどのように決定するかということです。私はクリス・パインの本の 99 本のボトルの挑戦について考え、「n + 1」または「n - 1」がその一部になることに気付きます。 1 で始まり 10,000 (1..10,000) で終わる「範囲ステートメント」と同様のソリューションです。
次に、インデックス作成について考えます。#upto または #each を使用して範囲をループ処理し、欠落している数値と、欠落している値を返すことができる何らかの条件文を特定する必要があると考えます。メソッド「missing_number」を定義しますが、入力は何ですか?
配列ですか?それともレンジですか?ほとんどの場合、配列はソートされておらず、テストするときに入力を範囲として定義するため、配列を使用します。
少し調査を行った後、重要なステップは配列内のすべての数値を合計して減算することであることを示す戦略に出くわしました
指定された範囲の合計との差。これは、定数値を扱っているため、適切なアプローチとして非常に理にかなっています。そのため、コードに通知するためにこのアプローチを選択しました。
def missing_number(array)
grand_sum = (array.length + 1) * (array.length + 2) / 2
sum = 0
array.each {|n| sum += n}
grand_sum - sum
end
x=(1..10000).to_a
x.delete rand(10000)
puts missing_number(x)