name
是输入字符串。
chars
是此结构的数组
struct {
char ch;
int occurs;
};
我想计算某个字符出现的次数,并在字符数组中保存字符和出现的值。
此外,所有数组字符的ch
部分都设置为'\0'
,int
部分设置为0
。
****我希望代码的结构保持不变,只能在哪里完成修复以及如何完成?
示例:yoyo
是字符串输入,我希望每个字符都保存在chars
数组中(y2 o2
)。
for(j=0;j<strlen(name);j++){
for(i=0;i<strlen(name);i++){
if(chars[i].ch=='\0'){
chars[i].ch=name[i];
chars[i].occurs=1;
break;
}
else if(chars[j].ch==name[i]){
chars[i].occurs++;
break;
}
}
}
答案 0 :(得分:1)
多次阅读你的问题后,我想我理解你的问题了 你想做什么。
我看到你解决的问题是内循环不正确。您
不能只运行strlen(name)
次,效率太高,因为这是上层
绑定,但您只需要检查到目前为止读取的所有不同值。此数字平均小于strlen(name)
。
此外,您应首先检查已读取的字符是否已在chars
中,并仅在其添加时才添加
还没有找到。你应该做的是这样的事情:
// pseudo code
for all characters in name:
found = False
for all distinct cached values:
if character is in cached value:
found = true
counter++
if found == False:
a new distinct value has been found
add a new cache entry
所以代码看起来像这样:
Chars chars[50];
size_t len = strlen(name);
size_t dv = 0; // number of distinct values
// initializing to 0
memset(chars, 0, sizeof chars);
for(size_t i = 0; i < len; ++i)
{
int found = 0;
for(size_t j = 0; j < dv; ++j)
{
if(chars[j].ch == name[i])
{
found = 1;
chars[j].occurs++;
break; // break inner loop
}
}
if(found == 1)
continue;
// checking array bounds
if(dv == (sizeof chars / sizeof chars[0]) - 1)
{
fprintf(stderr, "Too many distinct values, not enough space\n");
return ERROR_VALUE;
}
// a new distinct value has been found
chars[dv].ch = name[i];
chars[dv].occurs = 1;
dv++;
}
printf("The string '%s' has these distinct values:\n", name);
for(size_t i = 0; i < dv; ++i)
{
printf("%c: %d times\n", chars[i].ch, chars[i].occurs);
}
但就像我说的那样,这不是很有效,最糟糕的情况是O(n²)
。
更好的方法是将chars
声明为256的维度数组
int
值chars[i]
代表ASCII代码中的i
个字符:
int chars[256];
size_t len = strlen(name);
// initializing to 0
memset(chars, 0, sizeof chars);
for(size_t i = 0; i < len; ++i)
chars[(int) name[i]]++;
printf("The string '%s' has these distinct values:\n", name);
for(size_t i = 0; i < 256; ++i)
{
if(chars[i] > 0)
printf("%c: %d times\n", (char) i, chars[i]);
}