Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在C中删除字符串中的重复字符 每个字符的总数_Arrays_C - Fatal编程技术网

Arrays 如何在C中删除字符串中的重复字符 每个字符的总数

Arrays 如何在C中删除字符串中的重复字符 每个字符的总数,arrays,c,Arrays,C,由于长期隔离,乔乔变得非常无聊。为了摆脱无聊,乔乔提议和比比玩一个游戏。游戏计算单词中每个字符的总数。由于乔乔如此渴望获胜,他请你帮他猜比赛结果 格式输入 输入以整数T开始,即测试用例的数量。 每个测试用例都以一行开头,其中包含一个字符串W,表示单词。保证该单词只包含字母数字和空格 格式输出 每个测试用例将以一行“case#X:,其中X表示测试用例。这行后面是单词中每个字符的结果和字符数的总和。结果将首先按字母表排序,然后按数字排序 约束条件 1 ≤ |One of the most basic

由于长期隔离,乔乔变得非常无聊。为了摆脱无聊,乔乔提议和比比玩一个游戏。游戏计算单词中每个字符的总数。由于乔乔如此渴望获胜,他请你帮他猜比赛结果

格式输入

输入以整数
T
开始,即测试用例的数量。 每个测试用例都以一行开头,其中包含一个字符串
W
,表示单词。保证该单词只包含字母数字和空格

格式输出

每个测试用例将以一行
“case#X:
,其中
X
表示测试用例。这行后面是单词中每个字符的结果和字符数的总和。结果将首先按字母表排序,然后按数字排序

约束条件

1 ≤ |One of the most basic approaches when you need a count of the number of times any element within a collection occurs for a given set is to use a Frequency Array. Very simply, a Frequency Array contains the number of elements that can occur for a collection. (e.g. with what frequency does the thing mapped to each index occur?)

For example, if you want to know the number of times any one alpha-character occurs within a line of text (ignoring case), your collection has 26-elements (the letters in the alphabet). So you would simply declare an array of 26-elements (usually
int
or
size_t
), initialized all zero, and then loop over the characters in your line of text, and for each alpha-character, you increment the corresponding element of the array.

For example, with the array
int chars[26] = {0};
and for the line containing
"Dog"
, you would simply increment:

chars[toupper(line[0]) - 'A']++;   /* increments index chars[3]++  */
chars[toupper(line[1]) - 'A']++;   /* increments index chars[14]++ */
chars[toupper(line[2]) - 'A']++;   /* increments index chars[6]++  */

1≤ | 当需要计算给定集合中任何元素出现的次数时,最基本的方法之一是使用频率数组。非常简单,频率数组包含一个集合可以出现的元素数。(例如,映射到每个索引的事件发生的频率是多少?)

例如,如果您想知道任何一个字母字符在一行文本中出现的次数(忽略大小写),则集合有26个元素(字母表中的字母)。因此,您只需声明一个包含26个元素的数组(通常是
int
size\u t
),初始化所有零,然后在文本行中的字符上循环,对于每个字母字符,您增加数组中相应的元素

例如,使用数组
int chars[26]={0}“Dog”
的行,只需增加:

for (int i = 0; i < 26; i++)
    if (chars[i])
        printf ("[%c] => %d\n", i + 'A', chars[i]);
(请参阅以了解
toupper(第[0]行]-“A”
如何将字符映射到相应的索引。另请注意,为清晰起见,有意省略了对
无符号字符的强制转换)

在循环行中的所有字符后,可以通过循环频率数组的所有元素来输出结果,如果索引处的值大于零,则输出与该索引对应的字符和作为计数保留的值,例如

#include <stdio.h>
#include <ctype.h>

enum { DIGITS=10, CHARS=26, MAXC=1024 };    /* constants for use in program */

int main (int argc, char **argv) {
    
    char line[MAXC];        /* buffer to hold each line of input */
    int ncases = 0;         /* integer for number of cases */
    /* use filename provided as 1st argument (stdin by default) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
    
    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }
    
    if (!fgets (line, MAXC, fp)) {              /* read/validate 1st line */
        fputs ("(user canceled input)\n", stdout);
        return 0;
    }
    if (sscanf (line, "%d", &ncases) != 1) {    /* convert/validate to int */
        fputs ("error: invalid integer input for ncases.\n", stderr);
        return 1;
    }
    
现在,对于
NCASE
中的事例数,您只需循环该次数,从文件中读取下一行,循环
行中的每个字符
增加两个频率数组
字符
数字
的相应元素,以计算每个字符类型的出现次数(
alpha
digits
)然后依次在每个频率阵列上循环输出结果,以输出每个频率阵列的计数。您可以按如下操作:

    if (fp != stdin)   /* close file if not stdin */
        fclose (fp);
    
    return 0;
}
示例使用/输出

将示例输入放在文件
dat/charcountlines.txt
中,然后将其作为输入提供给程序,将导致以下结果:


以上内容与您指定的输出和排序相匹配。请仔细查看,如果您还有其他问题,请告诉我。

@anastaciu我正在使用它,但我忘了删除它,谢谢BTW这对我有帮助,谢谢@anastaciu您不需要那么多复杂和时间。您应该能够做到
O(n)
。MAXC是干什么的?谢谢,顺便说一句,它帮了我很多忙,我很高兴我能学到这个freq-arr的东西,这正是我在
可以容纳的最大字符数中使用的常量。在
枚举
中声明的每个常量都是为在代码中使用而设置的,在顶部执行它可以方便地进行更改它用于声明字符数组
字符行[MAXC];
I通常包括注释
/*如果需要常量,定义一个(或多个)或者使用enum*/
如果您还有其他问题,请告诉我。我很乐意进一步解释。祝您编码顺利!实际上我还有3个,但我会先试试的哈哈哈
    if (fp != stdin)   /* close file if not stdin */
        fclose (fp);
    
    return 0;
}
$ ./bin/charcount dat/charcountlines.txt

Case #1:

[A] => 4
[B] => 1
[E] => 1
[I] => 3
[N] => 4
[R] => 2
[S] => 2
[T] => 2
[U] => 2
[V] => 1
[Y] => 1

Case #2:

[B] => 1
[I] => 1
[N] => 1
[S] => 1
[U] => 1
[0] => 2
[2] => 2

Case #3:

[A] => 1
[C] => 2
[D] => 1
[I] => 2
[N] => 1
[O] => 3
[R] => 2
[S] => 1
[U] => 1
[V] => 2
[1] => 1
[9] => 1