Как убрать множественное вхождение char и оставить только один - PullRequest
0 голосов
/ 05 апреля 2019

Я не могу понять, как заменить несколько вводов символов в один, как показано выше. Пример ввода содержит массив элементов, которые принимают char и int как комбинацию.

И вывод должен быть отсортирован , и множественное вхождение должно быть удалено и заменено на одно, более того, следует добавить целое число, связанное с символом.

Пример ввода:

5
M 25
A 50
O 70
A 45
L 100

Пример вывода:

A 95
L 100
M 25
O 70

1 Ответ

1 голос
/ 05 апреля 2019

Вам не нужно удалять несколько вхождений , но для суммирования значений, связанных с каждым символом.

Ключ в парах - это просто символ, поэтому возможные значения ограничены, и их можно использовать в качестве индекса в массиве, содержащем сумму связанных значений, и другой, указывающий, использовался ли символ. В случае, если числа, связанные с символом, всегда положительны, возможно иметь только один массив, инициализирующий счет -1.

После того, как по определению итерации по последовательным индексам для записи счетчиков произведут их сортировку по символу.

Например:

#include <stdio.h>
#include <limits.h>

int main()
{
  int n, i;
  int count[1 << CHAR_BIT] = { 0 };
  char used[1 << CHAR_BIT] = { 0 };

  /* read inputs */
  puts("enter number of couples:");
  if ((scanf("%d", &n) != 1) || (n <= 0)) {
    fprintf(stderr, "invalid number");
    return -1;
  }

  puts("enter couples");
  for (i = 0; i != n; ++i) {
    unsigned char c;
    int v;

    if (scanf(" %c %d", &c, &v) != 2) {
      fprintf(stderr, "invalid couple");
      return -1;
    }
    used[c] = 1;
    count[c] += v;
  }

  /* write result */
  puts("result :");
  for (i = 0; i != (1 << CHAR_BIT); ++i) {
    if (used[i])
      printf("%c %d\n", (char) i, count[i]);
  }

  return 0;
}

Некоторые замечания:

  • Я не предполагаю, сколько битов в символе, я использую CHAR_BIT.
  • В формате " %c %d" пробел перед %c позволяет пропустить пробелы / перевод строки
  • Я заставляю символ c быть без знака , потому что я использую его как индекс и не хочу рисковать иметь отрицательный индекс
  • конечно когда я делаю scanf я проверяю успех

Компиляция и исполнение:

/tmp % gcc -pedantic -Wextra -Wall c.c
/tmp % ./a.out
enter number of couples:
5
enter couples
M 25 A 50 
      O 70 A 45 L 100
result :
A 95
L 100
M 25
O 70
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...