私はいくつかの整数を運ぶ配列を持っています。いう、numbers={3,0,1}
または言う、numbers={9,6,4,2,3,5,7,0,1}
。ここで、配列から欠落している数字を見つけなければなりません。この例のように、各セットには1つの欠損番号のみがあります。 1回目のミス2、2回目のミス8。
すでにコーディングしています。私のコードは、指定されたセットから1つの欠損値を見つけるだけでなく、特定のセットから1つ以上の欠損値を検出することもできます。
ただし、同じセットから2つの連続した数値が欠落している場合、検出に失敗します。
My code
import Java.util.Arrays;
public class Missing_number
{
public static void main( String args[] )
{
int numbers[]={9,6,4,5,7,0,1};
Arrays.sort(numbers);
int i=1;
while ( i < numbers.length )
{
if ( numbers[i] - numbers[i-1] == 1 )
{
}
else
{
System.out.println( "Missing number is " + ( numbers[i-1] + 1 ) );
}
i++;
}
}
}
配列内の最初の不足している数字を追加してから検索を開始できる場合、コードはどのように見えるのでしょうか? numbers={9,6,4,5,7,0,1}
現在、このセットには8がすでにありません。これで、リストからさらに2つの要素(2,3)を終了しました。 出力:私のコードに従って:2,8しかし、3もありませんが、表示されません。
数値配列に2を追加できれば、もう少し簡単になるかもしれないと思っています。しかし、私たちが知っているようにJava配列は不変なので、長さを増やすことはできません。
したがって、多分Listを使用します。しかし、リストではこのタイプのインデックス付けnumber[0]=something
サポートされていません。それでは、どうすれば先に進むことができますか。リストを使用していますか、それともアレイにスタックしていますか?
だから、私はarraylistでそれを作成しようとします。
Mycode(modified version from array)
public class T1 {
public static void main(String args[]){
List<Integer> numbers=new ArrayList<>();
numbers.add(9);
numbers.add(6);
numbers.add(4);
numbers.add(5);
numbers.add(7);
numbers.add(0);
numbers.add(1);
Collections.sort(numbers);
int i=1;
while(i< numbers.size()) {
if (numbers.get(i) - numbers.get(i-1) == 1) {
} else {
System.out.println("Missing number is " + (numbers.get(i-1) + 1));
numbers.add((numbers.get(i-1)+1));
Collections.sort(numbers);
}
i++;
}
}
}
Arraylistは私の問題を解決できます。しかし、単純な配列でこの問題を解決できる可能性はありますか?
このコードはHashSet
を使用します:
public static void main(String[] args) {
int[] numbers = {9, 6, 4, 5, 7, 0, 1};
Arrays.sort(numbers);
HashSet<Integer> set = new HashSet<>();
for (int i = numbers[0]; i < numbers[numbers.length - 1]; i++) {
set.add(i);
}
for (int i = 0; i < numbers.length; i++) {
set.remove(numbers[i]);
}
for (int x : set) {
System.out.print(x + " ");
}
}
印刷されます:
2 3 8
次のように機能します。
1。配列の最小数から配列の最大数までのすべての数値をセットに追加します。
2。配列を反復処理して、配列のすべての項目をセットから削除します。
3。セット内の残りの項目を印刷します。これらはすべて、配列の欠落している項目です。
else
句を次のように置き換えます。
for(int j=numbers[i-1] + 1; j <= numbers[i] - 1; j++) {
System.out.println( "Missing number is " + ( j ) );
}
ケースを調べてみましょう:並べ替え後の{9、6、4、5、7、0、1}は次のようになります:i
の場合は{0、1、4、5、6、7、7、9}インデックス2では、numbers[i]
とnumbers[i-1]
の差が1ではない(4-1 = 3)ことがわかります。1から4までの2、3のすべての数値が必要です。これを実現するには、numbers[i-1]
からnumbers[i]
(排他的)にループする必要があります。
このコードの複雑さは、N
(O(N))
の大きなものです。ここで、N
は配列の最大要素です。
ここでは答えられていない多くの質問があります。たとえば、配列は常にゼロで始まりますか?、可能な最大サイズは何ですか?など。
この問題に対処する簡単な方法を次に示します。
boolean
配列を作成します。true
として設定します。boolean
配列をスキャンして、値false
を持つすべてのインデックスを見つけて表示します。例:
元のセット:{1,0,3}
boolean
配列の値を設定している間、これが最終状態になります-> {true、true、false、true}boolean
配列をスキャンして印刷します2これは値= false
を持つインデックスのみであるためですint[] numbers = { 11, 6, 4, 5, 7, 1 };
Arrays.sort(numbers);
int numbersArrayIndex = 0;
for (int i = 0; i < numbers[numbers.length - 1]; i++) {
if (i == numbers[numbersArrayIndex]) {
numbersArrayIndex++;
}
else {
System.out.println(i);
}
}