我只是在学习C ++。我写了一个程序,显示字符串中重复的字母(我还要计算字母重复的次数)。问题是当我运行我的代码来获取句子中的重复字母时。对某些人来说,它运行正常但不是一些。例如:“hi there”运行良好的返回h和e,但像“people are nice”之类的东西会返回peeeeee。重复的字母只能显示一次。请把问题指出来。我认为它与循环有关,但无法准确解决。
void repeatWord(string sentence)
{
for(int i=0; i<sentence.length(); i++)
for(int j=i+1; j<sentence.length(); j++)
if((!isspace(sentence[i]))&&(sentence[i] == sentence[j])){
cout<<sentence[i]<<endl;
}
return;
}
答案 0 :(得分:3)
问题是你的内循环。它每次遇到时都会显示一次这封信。此外,在看到重复之后,您不会突破循环,因此会出现指数混乱。
更好的方法是记录您看过一封信的次数。这只需要一个循环和一个数组:
int count[256] = {0};
for( int i = 0; i < sentence.length(); i++ ) {
char c = sentence[i];
if( isalpha(c) && count[c]++ == 1 ) cout << c;
}
您可以使用std::set
代替数组。如果您正在处理Unicode,那将更合适。但是,我们只是在这里处理char
,这几乎是您可能正在练习的每个架构上的8位。
这样做的一点好处是你计算字母频率。您可以按如下方式输出:
for( int c = 0; c < 256; c++ ) {
if( count[c] ) cout << (char)c << " : " << count[c] << endl;
}
如果要输出不区分大小写的计数,一种方法就是这样:
for( int c = 'a'; c <= 'z'; c++ ) {
int total = count[c] + count[toupper(c)];
if( total ) cout << (char)c << " : " << total << endl;
}
答案 1 :(得分:1)
轻松删除重复的字母:只需插入<set>
或在看到它们后删除字母即可。然而,插入集合更有效:
set<char> letters;
for(int i=0; i<sentence.length(); i++)
for(int j=i+1; j<sentence.length(); j++)
if((!isspace(sentence[i]))&&(sentence[i] == sentence[j])){
letters.insert(sentence(i));
}
for(auto &i : letters)
cout << i << endl;