web-dev-qa-db-ja.com

javaの配列から欠落している要素をn個見つける

私はいくつかの整数を運ぶ配列を持っています。いう、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は私の問題を解決できます。しかし、単純な配列でこの問題を解決できる可能性はありますか?

11
Encipher

このコードは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。セット内の残りの項目を印刷します。これらはすべて、配列の欠落している項目です。

7
forpas

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は配列の最大要素です。

4
Mis94

ここでは答えられていない多くの質問があります。たとえば、配列は常にゼロで始まりますか?可能な最大サイズは何ですか?など。

この問題に対処する簡単な方法を次に示します。

  • セット内の最大数を見つけます。
  • 最後の手順で見つけた最大数に1を加えた長さの空のboolean配列を作成します。
  • 元のセットをスキャンし、元のセットの番号に等しいインデックスに新しいブール配列の値をtrueとして設定します。
  • 最後にboolean配列をスキャンして、値falseを持つすべてのインデックスを見つけて表示します。

例:

元のセット:{1,0,3}

  • ステップ1:セット内の最大数=
  • ステップ2:長さのブール配列= + 1-> {false、false、false、false}
  • ステップ3:元のセットをスキャンし、boolean配列の値を設定している間、これが最終状態になります-> {true、true、false、true}
  • ステップ4:最後にboolean配列をスキャンして印刷します2これは値= falseを持つインデックスのみであるためです
1
user2004685
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);
    }
}
0
null pointer