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

C++如何实现字符频率统计并通过动态数组存储统计结果?

实现代码

#include <iostream>
#include <string>
using namespace std;

struct unique_char {
    char character;
    int frequency;
};

int main() {
    string str;
    getline(cin, str);

    // 动态数组初始化:初始容量为0,已存储元素个数为0
    int capacity = 0;
    int size = 0;
    unique_char* chars = nullptr;

    // 遍历输入字符串的所有字符
    for (char c : str) {
        bool is_exist = false;
        // 匹配已收录的字符
        for (int i = 0; i < size; i++) {
            if (chars[i].character == c) {
                chars[i].frequency++;
                is_exist = true;
                break;
            }
        }
        // 未匹配到新字符,执行扩容逻辑
        if (!is_exist) {
            // 按需求每次扩容1个单位,如需提升性能可改为容量翻倍
            int new_capacity = capacity + 1;
            unique_char* new_arr = new unique_char[new_capacity];
            // 拷贝原有字符数据到新数组
            for (int i = 0; i < size; i++) {
                new_arr[i] = chars[i];
            }
            // 写入新字符的初始数据
            new_arr[size].character = c;
            new_arr[size].frequency = 1;
            // 释放旧数组内存,替换为新数组
            delete[] chars;
            chars = new_arr;
            capacity = new_capacity;
            size++;
        }
    }

    // 输出统计结果
    cout << "字符频率统计结果:" << endl;
    for (int i = 0; i < size; i++) {
        cout << "'" << chars[i].character << "' : " << chars[i].frequency << endl;
    }

    // 释放动态申请的内存,避免泄漏
    delete[] chars;

    system("PAUSE");
    return 0;
}

核心实现说明

  • 废弃固定长度100的数组声明,改为初始空指针,每次遇到未收录字符时申请更大的新数组、拷贝旧数据、释放旧数组,实现完全动态扩容。
  • 用size变量记录已收录的唯一字符总数,查找匹配时仅需要遍历到size位置即可,不需要遍历整个数组容量,减少无效运算。
  • 如果需要优化扩容性能,可以不用每次仅扩容1个单位,改为每次容量翻倍(初始容量设为2,满了之后扩容到4、8、16依次类推),减少内存申请和数据拷贝的总次数,仅需要修改扩容部分的容量计算逻辑即可。

内容的提问来源于stack exchange,提问作者dekaottoman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 04:45:03