C++中避免循环重复输出相同值数组元素的方法
嗨,这个问题其实挺常见的,核心问题就是你现在的逻辑是遍历原数组时,每碰到一个字母就统计它的总次数并立刻输出,所以同一个字母会被重复打印多次。解决思路很简单:先把所有字母的出现次数一次性统计完成,再遍历统计结果,只输出那些次数大于0的字母,这样每个字母就只会出现一次啦。给你两个实用的解决方案:
方法1:用数组计数(效率最高,适合字母范围明确的场景)
因为你统计的是a-zA-Z,如果不需要区分大小写,直接用一个大小为26的数组就足够;如果要区分,就用52个元素的数组(26个大写+26个小写)。代码示例如下:
#include <iostream> #include <cctype> // 用于统一大小写的toupper/tolower函数 int main() { char arr[] = {'A', 'A', 'F', 'A', 'D'}; int count[26] = {0}; // 初始化所有计数为0 // 第一步:完成所有字母的次数统计 for (char c : arr) { // 把字母统一转为大写,不区分大小写统计 char upper_char = toupper(c); count[upper_char - 'A']++; // 通过ASCII码计算数组索引 } // 第二步:遍历计数数组,只输出有出现的字母 for (int i = 0; i < 26; i++) { if (count[i] > 0) { std::cout << char('A' + i) << " - " << count[i] << " "; } } // 输出结果:A - 3 D - 1 F - 1 return 0; }
如果需要区分大小写,只需要调整计数数组和统计逻辑:
int count[52] = {0}; // 前26位存大写,后26位存小写 // 统计时判断字符类型 for (char c : arr) { if (isupper(c)) { count[c - 'A']++; } else if (islower(c)) { count[26 + c - 'a']++; } } // 输出时先遍历大写,再遍历小写 for (int i = 0; i < 26; i++) { if (count[i] > 0) { std::cout << char('A' + i) << " - " << count[i] << " "; } } for (int i = 26; i < 52; i++) { if (count[i] > 0) { std::cout << char('a' + i - 26) << " - " << count[i] << " "; } }
方法2:用STL容器(灵活省心,适合不确定字符范围的场景)
如果以后可能要统计更多类型的字符,用std::unordered_map或者std::map会更灵活,容器会自动帮你处理键的唯一性,不会重复。示例代码:
#include <iostream> #include <unordered_map> // 无序,效率更高;如果需要按字母顺序输出就用std::map int main() { char arr[] = {'A', 'A', 'F', 'A', 'D'}; std::unordered_map<char, int> char_count; // 统计次数:键不存在时会自动初始化为0,再执行++操作 for (char c : arr) { // 同样可以用toupper统一大小写,按需调整 char upper_char = toupper(c); char_count[upper_char]++; } // 遍历容器输出,每个键只会出现一次 for (const auto& pair : char_count) { std::cout << pair.first << " - " << pair.second << " "; } // 用unordered_map的输出顺序不固定,如果需要按字母排序,替换成std::map即可 return 0; }
简单总结下:你之前的问题出在边遍历原数组边输出统计结果,而正确的姿势是先完成全量统计,再遍历统计结果输出,这样就能避免重复打印啦。
内容的提问来源于stack exchange,提问作者NKNz
相关产品推荐
相关产品推荐

