You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:41:14