• 王道机试C++第 4 章 字符串:字符串内容续写几个小程序 Day30


    统计字符

    习题描述

    统计一个给定字符串中指定的字符出现的次数。

    输入描述: 测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过5的字符串,第2行为一个长度不超过80的字符串。注意这里的字符串包含空格,即空格也可能是要求被统计的字符之一。当读到'#'时输入结束,相应的结果不要输出。

    输出描述:对每个测试用例,统计第1行中字符串的每个字符在第2行字符串中出现的次数,按如下格式输出:c0 n0     c1 n1     c2 n2     ...     其中ci是第1行中第i个字符,ni是ci出现的次数。

    思路提示:

    法一:用普通方法循环寻找。

    法二:首先用一个 number 数组记录所有字符出现的频率,然后按照要求进行结果的输出即可。

    代码表示

    法一:

    1. #include <iostream>
    2. using namespace std;
    3. void count(string s1,string s2) {
    4. int cnt;
    5. for(int i = 0;i < s1.length(); i++) {
    6. cnt = 0;
    7. for(int j = 0;j < s2.length(); j++) {
    8. if(s1[i] == s2[j]) {
    9. cnt++;
    10. }
    11. }
    12. cout << s1[i] << ' ' << cnt << endl;
    13. }
    14. return ;
    15. }
    16. int main() {
    17. string s1, s2;
    18. while(getline(cin, s1)) {
    19. if(s1[0] == '#') break;
    20. getline(cin, s2);
    21. count(s1, s2);
    22. }
    23. return 0;
    24. }

    注意:① 写一个循环函数需要设定不同的变量

    ② 要注意输入字符串的时候用到getline(cin, s1);getline()属于string流则相反,可以接收空格、也可以自定义结束标志它将从输人流中提取界定符,但不会把它存储到结果缓冲区中。

    法二:

    1、思路:

    1)首先,使用 getline(cin, str2) 从输入中读取第二行字符串 str2

    2)然后,使用一个 for 循环遍历 str2 的每个字符。在循环中,通过 str2[i] 访问当前字符。

    3)在循环内部,使用 number[str2[i]]++ 将 str2[i] 对应的字符在 number 数组中的计数加 1。这行代码使用了数组下标访问,将当前字符作为索引,然后自增对应位置的计数器。

    4)经过上述循环后,number 数组中存储了 str2 中每个字符出现的次数。

    5)接下来,使用另一个 for 循环遍历第一行字符串 str1 中的每个字符。

    6)在循环内部,使用 printf("%c %d\n", str1[i], number[str1[i]]) 输出当前字符及其在 str2 中的出现次数。str1[i] 表示当前字符,number[str1[i]] 表示该字符在 str2 中出现的次数。

    2、memset(number, 0, sizeof(number)); 这行代码的作用是将 number 数组的所有元素都设置为 0,为后续的字符出现次数统计做初始化操作。这样,number 数组中的每个元素都表示对应字符在字符串中出现的次数,初始值为 0。

    1. #include <iostream>
    2. using namespace std;
    3. int main() {
    4. string str1,str2;
    5. int num;
    6. while (getline(cin, str1)){
    7. if (str1== "#") {
    8. break;
    9. }
    10. getline(cin, str2);
    11. memset(number, 0, sizeof(number)); //初始化数组
    12. for (int i = 0; i < str2.size(); ++i) {
    13. number[str2[i]]++;
    14. }
    15. for (int i = 0; i < str1.size(); ++i) {
    16. printf("%c %d\n", str1[i], number[str1[i]]);
    17. }
    18. }
    19. return 0;
    20. }

    字母统计

    习题描述

    输入一行字符串,计算其中A-Z大写字母出现的次数

    输入描述:案例可能有多组,每个案例输入为一行字符串。

    输出描述:对每个案例按A-Z的顺序输出其中大写字母出现的次数。

    代码表示

    法一:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int main() {
    4. string str;
    5. int number[128]; // 存储字符出现次数的数组
    6. while (getline(cin, str)) {
    7. memset(number, 0, sizeof(number)); // 初始化数组
    8. for (int i = 0; i < str.size(); ++i) {
    9. number[str[i]]++; // 统计字符出现次数
    10. }
    11. for (char c = 'A'; c <= 'Z'; ++c) {
    12. cout << c << ":" << number[c] << endl; // 输出字符及其出现次数
    13. }
    14. }
    15. return 0;
    16. }

    法二:(正向)

    1. #include <iostream>
    2. #include <cstring>
    3. using namespace std;
    4. int number[26];
    5. int main() {
    6. string str;
    7. while (cin >> str) {
    8. memset(number, 0, sizeof(number));
    9. for (int i = 0; i < str.size(); ++i) {
    10. if ('A' <= str[i] && str[i] <= 'Z') {
    11. number[str[i] - 'A']++;
    12. }
    13. }
    14. for (int i = 0; i < 26; ++i) {
    15. printf("%c:%d\n", 'A' + i, number[i]);
    16. }
    17. }
    18. return 0;
    19. }

    skew数

    代码描述

    在 skew binary 表示中,第 k 位的值 x[k] 表示 x[k]×(2^(k+1)-1)。每个位上的可能数字是 0 或 1,最后面一个非零位可以是 2;

    例如,10120(skew) = 1×(2^5-1) + 0×(2^4-1) + 1×(2^3-1) + 2×(2^2-1) + 0×(2^1-1) = 31 + 0 + 7 + 6 + 0 = 44。前十个 skew 数是 0、1、2、10、11、12、20、100、101、以及 102。

    输入描述:输入包括多组数据,每组数据包含一个 skew 数。

    输出描述:对应每一组数据,输出相应的十进制形式。结果不超过 2^31-1。

    代码表示

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int main(){
    4. string str;
    5. // int sum=0;
    6. while(getline(cin,str)){
    7. int sum=0;
    8. int j=str.size();//这个得在循环前设定值
    9. for(int i=0;i<str.size();++i){
    10. sum+=(str[i]-'0')*(pow(2,j)-1);
    11. --j;
    12. }
    13. printf("%d\n",sum);
    14. }
    15. }

    心得体会

    1、sum+=(str[i]-'0')*(pow(2,j)-1); 是用来计算 skew 数的十进制值的关键部分。

    1)(str[i]-'0'):这一部分是将字符类型的数字转换为相应的整数值。在 ASCII 编码中,字符 '0' 的值是 48,因此通过减去 '0',可以将字符类型的数字转换为相应的整数值。例如,字符 '0' 被转换为 0,字符 '1' 被转换为 1,以此类推。

    2)pow(2,j):这里使用了 pow 函数来计算 2 的 j 次方。

    2、int j=str.size(); 是在获取输入的 skew 数字符串的长度,并将其赋值给变量 j

    在这段代码中,首先需要知道输入的 skew 数有多长,因为在计算 skew 数的十进制值时,需要根据每一位的位置计算相应的权重。因此,通过 str.size() 来获取输入字符串的长度,然后将其赋值给变量 j,以便在后续的循环中使用 j 来表示当前位数。

    3、需要给两个变量 i 和 j

    字符串从左边(最左侧)开始计数,第一个字符的下标为0,第二个字符的下标为1,以此类推。

    例如,对于字符串 "Hello",它的字符下标如下所示:

    1. 字符: H e l l o
    2. 下标: 0 1 2 3 4

    4、pow(2, j) 表示计算 2 的 j 次幂,即求解 2 的 j 次方的值。在数学上,这个表达式等同于 2^j。 

  • 相关阅读:
    SparkSQL入门
    【数模】因子分析
    联表更新数据以及You can‘t specify target table ‘xxx‘ for update in FROM clause
    模拟网络延迟加载,添加正在加载中图标显示
    企业办公安全隐患不容忽视,墨门云终端安全来解决...
    新款模块上线实现SIP模块与扩拨电话之间打点与喊话功能 IP矿用电话模块SV-2800VP
    检查原生 JavaScript 函数是否被覆盖
    存储数据恢复- raid5多块硬盘出现坏道的数据恢复案例
    磁盘的基本知识和基本命令
    1688拍立淘API接口分享
  • 原文地址:https://blog.csdn.net/weixin_63597914/article/details/136590483