0

配列内の繰り返される要素を数えます.....入力は{1,1,1,1,2,2,2,3,3,4} 出力です

1=4
2=3
3=2
4=1
4

8 に答える 8

3
prev = input[0];
count = 1;
for (i = 1; i < ARRAYSIZE; i++)
{
  if (input[i] == prev) count++;
  else
  {
    printf("%d=%d ", prev, count);
    prev = input[i];
    count = 1;
  }
}
// Printing the last element
printf("%d=%d ", prev, count);
于 2009-05-12T08:41:45.233 に答える
2

すでにソートされている場合は、より高速な方法がある可能性があります

リストを半分に分割します。各セクションを次のように処理します。最初と最後の nummer をテストします。それらが同じであれば、結果はわかります。同じでない場合は、途中で分割し、それぞれの半分をもう一度繰り返します。

同じ数のロングランでは、これは効率的です。セクションが小さい場合は、1 つずつ方法に戻す必要があります。ランダムなスポットでデータをサンプリングし、s、s+1 をテストして、数値が前の数値から増加する時間のパーセンテージを取得できます。数値が大きいほど、早い段階で 1 つずつ方法に切り替える必要があります。

このメソッドは並列化も可能です。

于 2009-05-12T08:56:05.460 に答える
1

配列がソートされているようです(例によると)。その場合は、最初の要素を選択して、個別の値が見つかるまで配列を反復処理するだけです。このプロセス内で、ループ内にカウンターを配置して、発生をカウントできます。

次に、最初の要素の代わりに見つかった個別の値を選択し、プロセスを繰り返します。

于 2009-05-12T08:42:12.330 に答える
1

値の範囲が小さい場合は、sort をカウントするのとほぼ同じように、各要素のカウントを保持する別の配列を使用できます。値の範囲が広い場合は、ハッシュ テーブルが必要になります。

于 2009-05-12T08:59:53.330 に答える
0

良い方法は、配列内の要素を繰り返し処理し、表示される各要素の数を数えることです。終了したら、取得したカウントを出力します。

于 2009-05-12T08:27:18.877 に答える
0
void count_elements(int * pArray, long nElements)
{
    int * pStart;
    for ( pStart = pArray++; nElements > 1; nElements--, pArray++ )
    {
        if ( *pStart != *pArray )
        {
            printf("%i = %u ", *pStart, (pArray - pStart));
            pStart = pArray;
        }
    }
    printf("%i = %u ", *pStart, (pArray - pStart));
}
于 2009-05-13T07:36:34.130 に答える
0

簡単な例を説明しました。

// 各要素を数えます 元の配列の一意の各要素を保持するためにソートされたハッシュを作成します (リンクされたリストとしても実行できます) ハッシュ要素が既に存在する場合は配列から各要素を読み取りますハッシュ要素が存在しない キーと値のペアを作成する (値 = 1) ループ

// ハッシュのキーと printf("%d: %d\n", key, value); を介して各要素ループを出力します。ゼロ値も表す必要がある場合は、lastKey を実装し、キーと lastKey の比較を行って、キーがゼロかどうかを判断します。

並べ替えて簡単なプログラム/関数

于 2009-05-13T11:27:16.123 に答える
0

処理:
1) 配列項目の終わり
2) 空のケース
3) シングルトンのケース

#include <stdio.h>

int main() {

  int input[] = {1,1,1,1,2,2,2,3,3,4};

  if (sizeof(input) == 0) return 0;

  int prev = input[0];
  int count = 1;
  int i;
  int ARRAYSIZE = sizeof(input) / sizeof(int);

  for (i = 1; i < ARRAYSIZE; i++) {
    if (input[i] == prev) {
      count++;
    } else {
      printf("%d=%d ", prev, count);
      prev = input[i];
      count = 1;
    }

  }
  printf("%d=%d\n", prev, count);
  return 0;
}

そしてテストケース:

when input is {}
-----------------------------------
jianlin@ubuntu:~$ gcc try.c
jianlin@ubuntu:~$ ./a.out

when input is {123}
-----------------------------------
jianlin@ubuntu:~$ gcc try.c
jianlin@ubuntu:~$ ./a.out
123=1 

when input is {1,123}
-----------------------------------
jianlin@ubuntu:~$ gcc try.c
jianlin@ubuntu:~$ ./a.out
1=1 123=1 

when input is {1,1,1,1,2,2,2,3,3,4}
-----------------------------------
jianlin@ubuntu:~$ gcc try.c
jianlin@ubuntu:~$ ./a.out
1=4 2=3 3=2 4=1 

when input is {1,1,1,1,2,2,2,3,3,4,4}
-----------------------------------
jianlin@ubuntu:~$ gcc try.c
jianlin@ubuntu:~$ ./a.out
1=4 2=3 3=2 4=2 
于 2009-05-13T12:07:59.473 に答える