intの配列を受け取るsmoosh()メソッドを終了しようとしています。完了すると、配列には同じ番号が含まれているはずですが、配列に2つ以上の連続した重複番号がある場合は、それらは番号の1つのコピーに置き換えられます。したがって、smoosh()が実行された後、配列内の2つの連続する数値が同じになることはありません。
配列の最後にある未使用の要素はすべて-1に設定されます。
たとえば、入力配列が
[ 1 1 0 0 4 4 5 0 0 0 7 ]
それは読む
[ 1 0 4 5 0 7 ]
smoosh()が完了した後。
メソッドのシグネチャは次のとおりです。publicstaticvoidsmoosh(int [] ints)
私はこのようにそれを行うことができました:
for (int i=0; i<ints.length-1; i++) {
if (ints[i+1]==ints[i])
ints[i]=-1;
}
for (int i=0; i<ints.length-1; i++) {
if (ints[i]==-1) {
for (int j=i+1; j<ints.length; j++) {
if (ints[j]!=-1) {
//swap ints[j] and ints[i] and then break;
}
}
}
}
ただし、これはO(n2)時間になります(ほぼ適切ですが)。
これを行うには、O(n)を配置する必要があるように感じますが、その方法がわかりません。誰かがO(n)インプレースアルゴリズムを思いつくことができますか?(明らかに、処理を支援するために同じサイズの別の配列を作成すると、O(n)を簡単に取得できますが、それが適切に行われていないため、私が探しているものではありません...)
ありがとう!