1

免責事項: これは宿題なので、コードだけを提供しないでください。実際のコードをできるだけ少なくしてこれを行う方法について説明をお願いします。

したがって、ソートされていない同じ長さの 2 つの整数配列があり、重複する値を含めることができます。これは宿題なので、java.utils から何かを使用したり、配列を並べ替えたりすることは許可されていないという奇妙な条件があります。

順序に関係なく、2 つの配列に同一の要素が含まれているかどうかを確認することになっています。したがって、配列 [5, 6, 7, 5, 6, 3] と [6, 6, 7, 5, 5, 3] を比較すると true が返され、[7,7 8] と [7, 8, 8] を比較すると true が返されます。 ] しません。

これを行う方法がわかりません。質問を検索しましたが、すべてjava.utilsの何かを使用しているように見えるか、配列に重複が含まれていません。最初の配列の各値をループし、各値について 2 番目の配列をループして、その値がそこに存在するかどうかを確認しようとしましたが、重複でつまずきます。

正しい方向へのあらゆる種類のヘルプ、アドバイス、またはヒントをいただければ幸いです。ありがとう!

4

8 に答える 8

5

最初の int 配列から各要素を順番に取得し、2 番目の int 配列にあるかどうかを確認してみてはどうでしょうか。このアイデアを機能させるにfalseは、2 番目の int 配列の値が使用されているかどうかを示すために、すべて に初期化されたブール値の配列を作成する必要があります。次に、最初の配列から各値を見つけたら、ブール配列の対応する要素を に設定しtrueます。

于 2013-10-05T22:04:22.157 に答える
3

1 つの方法は、最初の配列を繰り返し処理し、2 番目の配列で見つかった等しい要素を削除することです。

最初の配列から 2 番目の配列の要素を見つけられなかった場合、配列は等しくありませんでした。2 番目の配列で最初の配列の最後の要素が見つかった場合、配列は等しくなりました。

配列を変更しない場合は、最初に変更した配列を複製する必要があります。

于 2013-10-05T22:14:16.117 に答える
1
1   public static boolean compare(int[] a, int[] b)
2   {
3       if(a.length != b.length) return false;
4
5       aloop:for(int i = 0; i < a.length; ++i)
6       {
7           bloop:for(int j = 0; j < b.length; ++j)
8           {
9               if(a[i] == b[j])
10              {
11                  for(int k = j; k < i; ++k)
12                  {
13                      if(a[k] == b[j])    continue bloop;
14                  }
15
16                  continue aloop;
17              }
18          }
19
20          return false;
21      }
22
23      return true;
24  }

これは基本的に、同じサイズの 2 つの配列(3) aとを取りb、トラフa (5)を反復し、トラフb (7)を反復し、 の要素を(9)aのすべての要素と比較し、 の要素が の要素と等しい場合:b ba

  • true の場合: のこの要素aが既に処理されているかどうかを確認し、a-loop (11)のインデックスを反復処理して、既に処理された要素(13)と比較します。
    • true の場合: の次の要素を取得bして繰り返します。(13)
    • false の場合: の次の要素を取得aして繰り返します。(17)
  • false の場合: まあ、どれもb等しい要素がない場合は false をa返す(18)

(23)にたどり着いた場合、 のすべての要素bは の要素ですa。真を返します。

編集: さらに、aloop と bloop を逆にして、少し余分なパフォーマンスを得ることができます。(人々を混乱させる傾向があるため、メインのコード ブロックには入れていません。)

bloop:for(int j = 0; j < b.length; ++j)
// could be written as
bloop:for(int j = b.length; (--j) >= 0; )
// which is faster as the comparison and incrementation step are merged into one
于 2013-10-06T00:03:46.347 に答える
1

ここでの解決策は、O(n²) であるため、長い配列では遅くなる可能性があります

// return how often n appears in an array
public static int count(int n, int[] array) { ... }

public static boolean equalarrays(int[] arr1, int[] arr2) {
   for (int i: arr1) {
       if (count(i, arr1) != count(i, arr2)) return false;
   }
   return arr1.length == arr2.length;
}
于 2013-10-05T23:04:49.130 に答える
0

これは、自分の時間に行う楽しいアクティビティです。2 つの配列テーブルのすべての値を含む 2 つの ArrayList を用意することをお勧めします。メソッドを使用できるので、私はこれを行っていますremove()。指定された最初の配列のすべての要素をループします。それが参照配列になります。参照配列の最初の反復でオブジェクトを取得します。次に、他の配列にそれが含まれているかどうかを確認します。そうでない場合、チェックは失敗falseし、その場ですぐに戻ることができます。そうであれば、それを削除してから、参照配列の次の反復を取得します。

コードは必要ありませんが、ここではペーストビンにあります: http://www.pastebin.com/3BEV2CqHObject[] ... tables引数を 受け取り、メソッドを使用equalsして比較します。私のように上手にできたら、きっと先生も驚かれることでしょう。

于 2013-10-05T23:09:13.867 に答える