如何删除多次出现的char并仅保留一个

时间:2019-04-05 07:01:58

标签: c

我不知道如何在单个输入中替换多个char输入,如上所示。样本输入包含将char和int作为组合的元素数组。

然后对输出进行排序,并删除多个出现的位置,并替换为一个,再加上与char相关的整数。

样本输入:

5
M 25
A 50
O 70
A 45
L 100

样本输出:

A 95
L 100
M 25
O 70

1 个答案:

答案 0 :(得分:1)

您不必删除多次出现,而只需对与每个字符关联的值求和即可。

两对中的键只是一个字符,因此可能的值受到限制,可以将它们用作包含相关值之和的数组的索引,而另一个则指示是否使用了该字符。如果与字符关联的数字始终为正,则可能只有一个数组将计数初始化为-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 unsigned ,因为我将其用作索引并且不想冒负数的风险
  • 当然当我执行 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