数据结构:串:第3关:统计字符出现的频度

任务描述

写一个算法统计在输入字符串中各个不同字符出现的频度,并将结果输出(字符串中的合法字符为A-Z之间的26个字母和0-9之间的10个数字)。

编程要求

输入

多组数据,每组数据有一行,为待统计字符频度的字符串。当字符串为“0”时,输入结束。

输出

对于每组数据输出n行,每一行为一个字符出现的频度(只输出存在的字符,格式为:字符:频度),字符排列顺序按照ASCII码从小到大的顺序。

测试说明

平台会对你编写的代码进行测试:

测试输入: LITTLE5ILOVEYOU AREYOUOKNUMB90077 0

预期输出: 5:1 E:2 I:2 L:3 O:2 T:2 U:1 V:1 Y:1 0:2 7:2 9:1 A:1 B:1 E:1 K:1 M:1 N:1 O:2 R:1 U:2 Y:1

1.个人最初的想法是对string c排序,删掉相同的(后续字符每个前移一位)并把出现次数给相应b[],但觉得没有按照ascII码的大小存储后,接着输出方便,便没有采用

2.虽然按照ascII码的大小存储后,接着输出很方便,但因此把main中的int[36]改为int[100],并且打印时因为b[]中存了值的位置是因string c的字符的ascII码而定,不仅分布散乱而且不知道长度,只能遍历整个数组。感觉是不太好

PS:string是c++的类型,并有c.length()方法表示字符串长度。也可理解为字符数组长度,string c的c应该和char c[10]的c一样都是指针,所以都可以用c[9]表示

#include<iostream>
#include<cstring>
using namespace std;
void Count(string c,int b[])
 {//统计字符出现的频度
/**************begin************/

    for(int i=0;c[i]!='\0';i++){//给对应字符的int[]赋值
        b[c[i]-'/']++;//因为main()中b[]默认0,'0'-'0'=0会出问题
    }
      
    //题目要求按ascII码顺序打印,通过按照ascII码顺序存值的b[]输出最合适
    for(int i=0;i<=100;i++){
      if(b[i]==0) continue;
      printf("%c:%d\n",i+'/',b[i]);//b[]中不会输出重复同一个字符,因为同一字符-'/'的值一样

    
        /**************end************/
 }
 }
int main()
{
    string c;     //存储输入的字符串
    while(cin>>c)//键入string c
    {
        if(c=="0") break;
        int *b=new int[100]{0};        	//存储对应字符的个数
        Count(c,b);
    }
    return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值