0

Arrays.sort() でソートされた Java 配列で重複するセグメントを見つけようとしています。同じ int が配列内で重複するセグメントを形成することを期待しています。たとえば、並べ替え後の配列は {1, 2, 3, 3, 3, 3, 5, 6, 8, 8, 8, 8, 8, 9, 9, 9, 9} です。

重複するセグメントを見つけるために、次のアイデアを実装したいと考えています。2 つのポインター (i と j) で while ループを使用したいと考えています。

1.) i をインデックス 0 から開始し、j を最後のインデックス (N-1) から開始します。2.) j-- を実行している間、i をインデックス 0 のままにします。j が i の次のインデックスに到達し、セグメントが見つからない場合、i を 1 ずつインクリメントし、j をインデックス N-1 に再初期化します 3.) 手順 1 と 2 を繰り返します。 j をインデックス N-1 にします。4.) i==j の場合、while ループを終了します。

以下は私の試みですが、私の実行からではありません。

int[] test = new int[] {1, 2, 3, 3, 3, 3, 5, 6, 8, 8, 8, 8, 8, 9, 9, 9, 9};
        int i = 0;
        int j = test.length - 1;
        int[] copySegment;

        while (j > i)
        {
            if (test[j] == test[i])
            {
                int segmentLength = j - i + 1;
                copySegment = new int[segmentLength];
                for (int k = j; k >= i; k--)
                {
                    copySegment[segmentLength--] = test[k];
                }
                for (int e : copySegment)
                {
                    System.out.print(e + " ");
                }
            }
            j--;
            i++;
        }
4

4 に答える 4

1

配列が事前に並べ替えられていることを考慮すると (それ以外の場合は、Array.sort()それらを並べ替えることができます)、あなたがしていることを行うためのより簡単な方法を思いつきました..

int[] array = new int[] {1, 2, 3, 3, 3, 3, 5, 6, 8, 8, 8, 8, 8, 9, 9, 9, 9};

Map<Integer, Integer> intList= new HashMap<Integer, Integer>(); 

int curCount=1;
for (int i=0; i<array.length-1; i++){
    if (array[i]==array[i+1] ){
        curCount++;
        if(i==array.length-2)
            intList.put(array[i], curCount);
    }
    else{
        intList.put(array[i], curCount);
        curCount=1;
    }

}

for (Map.Entry<Integer, Integer> entry : intList.entrySet())
{
    if(entry.getValue()<2)
        continue;
    else {
        for (int i=0; i<entry.getValue(); i++)
        System.out.println(entry.getKey());

    }
}

このコードを実行してテストしました。それが役に立てば幸い。

于 2013-09-14T05:27:47.533 に答える
0

あなたの説明とは対照的に、あなたのコードは減少してiいる間は固定されません。j実際、毎回j減少し、i増加します。

意図を実行するには、2 つのwhileループが必要です。1 つは増分する外側のループ、もう1 つは下から まで減i分する内側のループです。jtest.lengthi+1

ただし、@BlackPanther のアプローチは、より少ない計算で目的の結果を提供するように見えるので、あなたのアプローチよりも望ましいと思います。

于 2013-09-14T04:14:41.663 に答える
0

これを行う私の方法では、@BlackPanther のソリューションよりも多くの配列アクセスが必要ですが、最終的に次のように機能するようにしました:edited.

int[] test = new int[] {1, 2, 3, 3, 3, 3, 5, 6, 8, 8, 8, 8, 8, 9, 9, 9, 9};
        int i = 0;
        int j = test.length - 1;
        int[] copySegment;

        while (i < test.length)
        {
            while (j > i)
            {
                if (test[j] == test[i])
                {
                    for (int k = i; k <= j; k++)
                        System.out.print(test[k] + " ");
                    System.out.print("\n");
                    i = j + 1;
                    j = test.length;
                }
                j--;
            }
            i++;
            j = test.length - 1;
        }
于 2013-09-14T04:26:37.520 に答える