华为OJ平台——(基础篇)字符统计

题目要求:对字符中的各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。实现以下接口: 输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)。按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出清空目前的统计结果,重新统计。调用者会保证:输入的字符串以‘\0’结尾。

代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4
  5 void statics(char *str)
  6 {
  7     //char (*ch)[2];
  8     //ch=(char(*)[2])malloc(len);   //   ch[2][len]
  9     int len=strlen(str);
 10     char **ch;
 11     ch=(char**)malloc(len*sizeof(char*));
 12     for(int i=0;i<len;++i)
 13     {
 14         ch[i]=(char*)malloc(2*sizeof(char));    //  ch[len][2] ,ch[][0]保存字符 ,ch[][1]保存字符出现次数
 15     }
 16     int i,j,k,n;
 17     for(i=0;i<len;++i)
 18         ch[i][1]=0;                    //  初始化ch[][1],以便后面的自增操作
 19     for(n=0;n<len;++n)
 20         if (str[n]==‘ ‘||(str[n]>=‘0‘&&str[n]<=‘9‘)||(str[n]>=‘a‘&&str[n]<=‘z‘)||(str[n]>=‘A‘&&str[n]<=‘Z‘))
 21         {
 22             ch[0][0]=str[n];     //  以字符串中第一个符合条件的字符初始化ch[0][0]
 23             ++ch[0][1];
 24             break;
 25         }
 26
 27         i=n+1;k=1;     // i从第二个满足条件的字符开始 , k记录ch中保存的字符数
 28         while(str[i]!=‘\0‘)        //  统计字符串中的字符
 29         {
 30             char c=str[i];
 31             if (str[i]==‘ ‘||(str[i]>=‘0‘&&str[i]<=‘9‘)||(str[i]>=‘a‘&&str[i]<=‘z‘)||(str[i]>=‘A‘&&str[i]<=‘Z‘))
 32             {
 33                 for (j=0;j<k;++j)
 34                 {
 35                     if (c==ch[j][0])
 36                     {
 37                         ++ch[j][1];
 38                         break;
 39                     }
 40                 }
 41                 if (j==k)
 42                 {
 43                     ch[j][0]=c;
 44                     ++ch[j][1];
 45                     ++k;
 46                 }
 47             }
 48             ++i;
 49         }
 50         char temp_ch;
 51         int temp_int;
 52         bool change;
 53         for (i=1;i<k;++i)   // 采用冒泡排序算法
 54         {
 55             change=false;
 56             for (j=1;j<=k-i;++j)
 57             {
 58                 if (ch[j-1][1]<ch[j][1])   //按照ch[][1]保存的字符个数从大到小排序
 59                 {
 60                     temp_ch=ch[j-1][0];
 61                     ch[j-1][0]=ch[j][0];
 62                     ch[j][0]=temp_ch;
 63                     temp_int=ch[j-1][1];
 64                     ch[j-1][1]=ch[j][1];
 65                     ch[j][1]=temp_int;
 66                     change=true;
 67                 }
 68                 if (ch[j-1][1]==ch[j][1])   //如果字符个数相等,按照ch[][0]保存的字符排序,ASII小的在前
 69                 {
 70                     if (ch[j-1][0]>ch[j][0])
 71                     {
 72                         temp_ch=ch[j-1][0];
 73                         ch[j-1][0]=ch[j][0];
 74                         ch[j][0]=temp_ch;
 75                         temp_int=ch[j-1][1];
 76                         ch[j-1][1]=ch[j][1];
 77                         ch[j][1]=temp_int;
 78                         change=true;
 79                     }
 80                 }
 81
 82             }
 83             if (!change)
 84             {
 85                 break;
 86             }
 87         }
 88         for(i=0;i<k;++i)        // 将结果复制给str
 89         {
 90             str[i]=ch[i][0];
 91         }
 92         str[i]=‘\0‘;
 93
 94         for (i=0;i<len;++i)
 95         {
 96             free(ch[i]);
 97         }
 98         free(ch);
 99
100 }
101
102 int main()
103 {
104     int i=0;
105     char str[256],ch;
106     //scanf("%s",str);
107     gets(str);
108     int len=strlen(str);
109
110     statics(str);
111     i=0;
112     while(str[i]!=‘\0‘)
113     {
114         printf("%c",str[i++]);
115     }
116
117     return 0;
118 }

错误总结:

1.如何定义二维数组?

答题过程中,错误地认为下面的代码会定义二维数组ch[len][2],其实,下面的代码定义的二维数组为ch[2][len]。

1     char (*ch)[2];
2     ch=(char(*)[2])malloc(len);   //   ch[2][len]

可以使用下面的代码定义ch[len][2]。

1     char **ch;
2     ch=(char**)malloc(len*sizeof(char*));
3     for(int i=0;i<len;++i)
4     {
5         ch[i]=(char*)malloc(2*sizeof(char));    //  ch[len][2] ,ch[][0]保存字符 ,ch[][1]保存字符出现次数
6     }

2.如何输入带空格的字符串?

答题过程中,采用了scanf函数,导致了不能输入含空格的字符串,因为scanf将空格字符作为输入的字符串之间的分割符。

可以采用gets()输入带空格的字符串。

时间: 2024-07-29 18:50:51

华为OJ平台——(基础篇)字符统计的相关文章

华为OJ平台——字符串分隔

题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输出 输出到长度为8,的新字符串数组样例输入 abc 123456789样例输出 abc00000 12345678 90000000 思路: 都是直接处理,没有具体的方法而言 注意点: 华为的OJ平台的输入输出有点坑,好多次的程序都在这里出问题,在Eclipse上运行的结果没问题,然后在OJ上就是编

华为OJ平台——矩阵乘法

题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵的列数 4.第一个矩阵的值 5.第二个矩阵的值 输出: 输出两个矩阵相乘的结果 样例输入 2 2 2 3 8 8 0 9 0 18 9 样例输出 171 72 72 0 思路: 题目意思很简单,只是实现两个矩阵乘法功能,要注意的一点是输出的格式. OJ平台中对输出的格式非常严格,经过多次尝试,验证此

华为OJ平台——统计字符串中的大写字母

题目描述: 统计字符串中的大写字母的个数 输入: 一行字符串 输出: 字符串中大写字母的个数(当空串时输出0) 思路: 这一题很简单,直接判断字符串中的每一个字符即可,唯一要注意的一点是输入的字符串可能包含空格,所以读入的时候要用nextLine()方法 1 import java.util.Scanner; 2 3 public class CountCaptial { 4 5 public static void main(String[] args) { 6 Scanner cin = n

【华为OJ平台练习题】统计一段字符串中含有空格、英文、数字的个数

//统计一段字符串中含有空格.英文.数字的个数 #include <iostream> using namespace std; void processString(char* s) { int n = strlen(s); int kg=0; int shuzi=0; int yingwen=0; if(n>0) { for(int a=0;a<n;a++) { if(s[a]==' ') kg++; if(s[a]<='9'&&s[a]>='0')

华为OJ平台——首次不重复字符

题目描述: 输入一个字符串,输出字符串中第一个没有重复的字符,若没有满足条件的字符存在,则输出“.” 思路: 这题很简单,直接逐次比较就好了,但是没有考虑到更好效率的方法,以后想到的话再加上来 1 import java.util.Scanner; 2 3 /** 4 * 输入一个字符串,输出字符串中第一个没有重复的字符 5 * 若没有满足条件的字符存在,则输出“.” 6 * 7 */ 8 public class FirstAppearance { 9 10 public static voi

【华为OJ平台练习题】求最大公共子串的个数和元素

1.原题是求出最大公共子串的个数即可 原理:利用二维矩阵排列的方式,将俩字符串进行比较 #include <iostream> #include <vector> using namespace std; int prcs_2Strs(const char* s1,const char* s2) { int maxSameLength = 0; int L1 = strlen(s1); int L2 = strlen(s2); if(L1==0 || L2==0) //判断字符串是

????OJ平台:数组成绩统计

复仇者联盟之数组成绩统计 Description 定义一个5行3列的二维数组,各行分别代表一名学生的高数.英语.C++成绩.再定义一个有5个元素的一维数组,用于存储每名学生的平均成绩.请输入学生的各门课成绩,输出带平均成绩的成绩单,以及所有学生平均成绩的平均值. Input 15个整数,表示5名学生3科的成绩 Output 分5行显示每名学生的成绩及平均成绩 再显示所有学生平均成绩的平均值(保留两位小数) Sample Input 97 78 87 78 63 68 73 81 85 91 87

华为OJ平台——字符串通配符

题目描述: 在计算机中,通配符一种特殊语法,广泛应用于文件搜索.数据库.正则表达式等领域.现要求各位实现字符串通配符的算法.要求:实现如下2个通配符: *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写.下同)(不包含. , 等特殊字符) ?:匹配1个字符 输入 通配符表达式: 一组字符串. 输出 返回匹配的结果,正确输出true,错误输出false 思路: 分三种情况: (1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false (2)通配符为?的情况:对应的

华为OJ平台——求最大连续bit数

题目描述: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字    输出: 对应的二进制数字中1的最大连续数 思路: 通过移位运算可以一次判断每一位的0.1值,然后通过统计可以得到结果 import java.util.Scanner; //byte 的范围是-128~127 public class MaxContinueOne { public static void main(String[] args) {