1

これが私が数日間取り組んできた問題です。

ソートされた配列を取得するプログラムを作成する必要があります。プログラムは、2つの隣接するブロックが同じ値を持つ999を配置し、次にすべての999を配列の最後に配置します。別の配列を使用せずにこれを行う必要があり、プログラムはO(n)である必要があります。

入力例:

50,60,60,72,81,81,81,81,93,93

必要な出力:

50,60,72,81,93,999,999,999,999,999

もう一つの例:

1,1,2,3,4,4,5,6,6

必要な出力:

1,2,3,4,5,6,999,999,999

私のコード。動いていない。最初の例では、出力は問題ありません。2番目の例では、1,2,3,4,5,4,5,6、-14568127(配列の範囲外)を取得します

私のアルゴリズムは、iとjの2つのインデックスを持つ配列をウォークスルーし、a [i]!= a [i + 1]の場合、iを進めます。それらが等しい場合、jは次の一意の値を探し、それをa [i+1]に入れます。

これを行うためのより良いアイデアやコードを聞きたいです。Cで。

while((j!=size-1)&&(a[size-1]!=a[i]))
{
     if(a[i]!=a[i+1])
     {
         i++;
         j=i;
     }
     if(a[i]==a[i+1])
     {
         j=i;
         while(a[i]==a[j])
               j++;
         a[i+1]=a[j];
         i++;
         if(j!=size-1)
              j=i;
     }
}
i++
for(;i<size;i++)
      a[i]=999;

私はコードを編集しましたが、今はchenが提案したように編集しています。まず、doubleが存在する場所に999を配置して配列を反復処理しますが、切り替えたいときに問題が発生します。配列を再ソートするために私が書いたコードは次のとおりです。999をどこかに置くたびに、count++。

それは私が完全に与えた2つの例のために働いています。みんな、ありがとう。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
    int *a;
    int i=0,j=0,size,count=0;
    printf("Enter the size of the array\n");
    scanf("%d", &size);
    a=(int *)calloc(size,sizeof(int));
    printf("Enter %d numbers\n",size);
    for(i=0;i<size;i++)
        scanf("%d",&a[i]);
    printf("The array recieved is :\n");
    for(i=0;i<size;i++)
        printf(" %d ", a[i]);
    i=0;
    printf("\n");
    for(i=0;i<size;i++)
    {
        if(a[i]==a[i+1])
        {
            j=i+1;
            while(a[i]==a[j])
            {
                a[j]=999;
                j++;
            }
            count++;
        }
    }
    while(count!=0)
    {
        for(i=0;i<size-1;i++)
        {
            j=i;
            if(a[j]==999)
            {
                a[j]=a[j+1];
                a[j+1]=999;
            }
        }
        count--;
    }
    printf("The new array is: \n");
    for(i=0;i<size;i++)
        printf(" %d ",a[i]);
    free(a);
    getch();
}
4

3 に答える 3

0

これを行う最も簡単な方法は、最初に重複を削除してから、配列の残りの部分を。で埋めること999です。

重複の削除はO(n)であり、配列の入力はO(n)です。

于 2012-12-21T03:03:06.300 に答える
0

O(n)で実行される一般的なアプローチは次のとおりです。

仮定:入力配列には含まれていません999(含まれている場合は問題ありません。別の番兵値を使用する必要があります)。

  • 配列を1回繰り返します。
    • 各要素について、次の要素を先読みしてください
    • 現在の要素と重複している場合は、次のように変更します999
    • 999別の要素にぶつかるまで、先を見越して重複をマークし続けます。
  • 最後にすべての999'が必要なので、2つの別々のポインターを保持します。
    • 最初の配列Xのどこにあるかを追跡するためのインデックス999
    • numスワッピングプロセスのどこにいるかを追跡するための別のインデックス
  • 999配列を再度反復し、これら2つのポインターを使用してすべての有効な数値を交換します。

これは紛らわしいように聞こえるかもしれませんので、ここにあなたの例の1つを使用した疑似アニメーションがありますW:(読みやすさのために「999」の代わりに番兵として使用)

1,1,2,3,4,4,5,6,6,
1,W,2,3,4,4,5,6,6,
1,W,2,3,4,W,5,6,6,
1,W,2,3,4,W,5,6,W,
1,2,W,3,4,W,5,6,W,
1,2,3,W,4,W,5,6,W,
1,2,3,4,W,W,5,6,W,
1,2,3,4,5,W,W,6,W,
1,2,3,4,5,6,W,W,W,

W繰り返しになりますが、今回は数字の接尾辞でラベルを付けて、どのスワップが発生しているかを確認できるようにします。

1,1,2,3,4,4,5,6,6,
1,W1,2,3,4,4,5,6,6,
1,W1,2,3,4,W2,5,6,6,
1,W1,2,3,4,W2,5,6,W3,
1,2,W1,3,4,W2,5,6,W3,
1,2,3,W1,4,W2,5,6,W3,
1,2,3,4,W1,W2,5,6,W3,
1,2,3,4,5,W2,W1,6,W3,
1,2,3,4,5,6,W1,W2,W3,
于 2012-12-20T23:09:10.653 に答える
0

これが学校の演習用であり、あなたが Google で働いておらず、世界地図で場所の重複を削除する必要があると仮定すると、アルゴリズムはほぼ正しいように思えます。

非常に多数の潜在的な重複の場合、またリストがソートされていると仮定すると、最も近い大きな要素の検索に基づく方法を使用できます。次に、2 つの要素間の距離を測定することで、より効率的であることがわかります。

于 2012-12-20T23:02:20.233 に答える