duck_kk 2023-02-23 20:16 采纳率: 50%
浏览 42
已结题

c++ 字符序列中出现次数为奇数的字符

问题:挑选出字符序列中出现次数为奇数的字符,然后按照ascii码顺序输出这些字符
下面这个代码可以找出出现奇数次的字符,但不能顺利排序去重,想知道自己的问题在哪里呢
void OddFilter(char a[], int size) {
    int b[1000];//用于每个字符出现的次数
    for (int i = 0; i < size; i++) {
        int sum = 0;
        char p = a[i];
        for (int j = 0; j < size; j++) {
            if (p == a[j]) { ++sum; }
        }
        b[i] = sum;
    }
    char location[1000] = {'\0'};//用于储存字符
    int x = 0;
    for (int i = 0; i < size; i++) {
        if (b[i] % 2 != 0) {  //如果是奇数
            location[x] = a[i];//将A中对应字符储存进location
            x++;
        }
    }//出现奇数次的储存进location
    for (int i = 0; i < x-1; i++) {
        for (int q = 0; q >= x - i-1; x++) {
            if (location[q + 1] < location[q]) {
                char temp = location[q];
                location[q] = location[q + 1];
                location[q + 1] = temp;
            }
        }
    }//排序
    for (int i = 0; location[i+1] != '\0'; i++) {
        if (location[i] == location[i + 1]) {
            location[i + 1] = location[i + 2];
        }
    }//去重
    int l = strlen(location);
    cout << location[0];
    for (int i = 1; i < l; i++) {
        cout << " " << location[i];
    }
}


输入:Thisisateststring
运行结果:T h i a t e t t r i n g
我想要达到的结果:T a e g h i n r t

##刚开始学,感谢帮助!

  • 写回答

2条回答 默认 最新

  • CodeBytes 2023-02-23 20:23
    关注

    该回答引用ChatGPT

    代码如下
    修改后的代码将字符出现次数的数组b改成了大小为128的数组,因为ascii码表中的字符一共有128个,可以通过字符的ascii码作为下标直接记录每个字符出现的次数。在统计完每个字符的出现次数后,将出现奇数次的字符储存在location数组中,然后调用C++标准库中的sort函数进行排序。最后,通过另一个数组result实现去重并输出结果。

    void OddFilter(char a[], int size) {
        int b[128] = {0};  // 记录每个字符出现的次数
        for (int i = 0; i < size; i++) {
            b[a[i]]++;
        }
        char location[128] = {0};  // 用于储存字符
        int x = 0;
        for (int i = 0; i < 128; i++) {
            if (b[i] % 2 != 0) {
                location[x] = (char)i;  // 将出现奇数次的字符储存在location中
                x++;
            }
        }
        sort(location, location+x);  // 排序
        char result[128] = {0};
        int len = 0;
        for (int i = 0; i < x; i++) {
            if (i == 0 || location[i] != location[i-1]) {
                result[len] = location[i];  // 去重
                len++;
            }
        }
        cout << result;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月3日
  • 已采纳回答 2月23日
  • 创建了问题 2月23日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?