蓝桥杯练习题十四 - 次数差(c++)
题目如下
问题描述
x星球有26只球队,分别用 a ~ z 的26个字母代表。他们总是不停地比赛。
在某一赛段,哪个球队获胜了,就记录下代表它的字母,这样就形成一个长长的串。
国王总是询问:获胜次数最多的和获胜次数最少的有多大差距?
(当然,他不关心那些一次也没获胜的,认为他们在怠工罢了)
输入格式
一个串,表示球队获胜情况(保证串的长度<1000)
输出格式
要求输出一个数字,表示出现次数最多的字母比出现次数最少的字母多了多少次。
样例输入1
abaabcaa
样例输出1
4
提示
a 出现 5 次,最多;c 出现1次,最少。
5 - 1 = 4
样例输入2(这里貌似题目写错了,输出应为4)
bbccccddaaaacccc
样例输出2
6
以下选项错误的是?
A.
int cnt[1001];
int main()
{string s;cin >> s;int max1 = -1, min1 = 1001;for (int i = 0; i < s.length(); i++){for (int j = 0; j <= s.length(); j++){if (s[i] == s[j]){cnt[i]++;}}}for (int i = 0; i < s.length(); i++){if (cnt[i] > max1){max1 = cnt[i];}if (cnt[i] < min1){min1 = cnt[i];}}cout << max1 - min1 << endl;return 0;
}
B.
int main()
{char s[1000];scanf("%s", &s);int len = strlen(s);int helper[256] = {0};int max = 0, min = len;for (int i = 0; i < len; i++){helper[s[i]]++;}for (int i = 0; i < 256; i++){if (helper[i] > max){max = helper[i];}if (helper[i] < min && helper[i] != 0){min = helper[i];}}printf("%d\n", max - min);return 0;
}
C.
const int N = 1010;
int cnt[26];
char a[N];
char b[27] = {"abcdefghijklmnopqrstuvwxyz"};int main()
{cin >> a;for (int i = 0; i < 26; i++)for (int j = 0; a[j]; j++)if (b[i] == a[j + 1])cnt[i]++;int maxn = 0, minn = 1000;for (int i = 0; i <= 26; i++)if (cnt[i]){maxn = max(maxn, cnt[i]);minn = min(minn, cnt[i]);}cout << maxn - minn << endl;return 0;
}
D.
int a[26];int main()
{string str;cin >> str;for (int i = 0; i < str.length(); i++){a[str[i] - 'a']++;}sort(a, a + 26);for (int i = 0; i < 26; i++){if (a[i] != 0){cout << a[25] - a[i] << endl;break;}}return 0;
}
题目解析
惯例先吐槽这类选择题,太折磨人了,还是那句话,做对一道题很容易,难的是用多种方法做出同一道题。此选项在官方题库中会变换,以本博客中为例。
题目大家也看完了,如果是你,你会怎么做?先来说说博主的思路吧:
- 一大串字母组成的字符串,里面有很多字母是重复的,这是关键;
- 找出里面出现次数最多的字母和出现次数最少的字母,出现0次的不算;
- 用出现次数最多的字母减去出现次数最少的字母得到的值就是我要的那个数字;
- 题目中没有说要知道最大的字母和最小的字母,这也是个突破点。
那么问题来了,怎么找到出现次数最大和最小的字母?
如果是我,会将a~z的字母列出来,分别计算每个字母出现的次数,再通过冒泡排序法,找出最大和最小的两个数字,特别强调,这里一定要忽略出现0次的数字,最大数减最小书就得到了这个值。
这样一说,是不是就觉得不难了?接着我们看看四个选项都是怎么做的:
A选项:
好巧不巧,恰好是和博主刚刚说的方法是一样的,在寻找最大最小数时略有差异,它是先计算出每个字母出现的次数,再通过比较的方式取出最大值和最小值,这也给了博主启发,却是这种方式要比冒泡或者选择排序这两种方式的效率要高,因为少了个内部for循环,计算的次数就少了。
B选项:
博主发现B选项和A选项有异曲同工之妙,首先是找出每个字母出现的次数,方法却略微不同,这里采用的是多维数组的形式,for循环长度是字符串的长度,s[i]是i位置的字符,其随i的自增,若相同字符,helper[x]就+1,这样就获得了每个字符出现的次数的一个数组,接下来计算出现次数最多的字符和最少的字符就可以了。计算的方式和A选项是一样的。
就目前AB两个选项而言,B选项的效率明显是要高于A选项的,这个不接受反驳。
C选项:
大体看起来计算方法是没错的,当看到第一个for循环的时候还是发现了问题,if怕断中b[i]==a[j+1]似乎是有问题的,第一次出现的字符我们默认是一次,这里直接忽略了第一位,那最大值不变,但是总值要小1,最小值很可能就改变了,本来出现一次的是最小值,结果直接变成了0,最小值变化,结果是有可能和原值一样的,但存在一定的概率,我们不敢赌每次都一样,所以C一定是错误的。
D选项:
到C我们就可以结束了,不过我们还是继续看下D选项是怎么做的。打眼一看,流程没错,细看过程,不懂的点在a[str[i]-'a'],这个是c语法,其实博主对c的一些语法也不是特别懂,那我们来猜下这里的意思,str[i]是一个字符,字符减去初始字符'a',那就是0,这里我们就得到每个字符代表的0-25的位置。
有人会说,B选项里不是也有个多维数组吗?那里面似乎没有这么做,直接用字符代表位置啊,啥情况?那是因为B里直接用字符,使用的是BASIC码表的东西,其中ASCII码范围0-255,所以B选项helper大小才是256。如果说的不对,欢迎指正。
总结
终于结束了,这道题不是很难,但是博主对这种选项题真是头疼,前面看过的一些比较简单的题目有的也跳过去了,有些有意义的就和大家做个分享,题目多是对基础算法的考察,做程序,基础还是要做好的,建议大家有时间还是要学学c/c++,基础的东西往往兼容性更高,使用的范围也很广,做一些深入研究的时候很有使用价值,特别是偏底层的一些东西,相信你已经多多少少接触到了,不妨现在就开始学习吧。
蓝桥杯练习题十四 - 次数差(c++)相关推荐
- 中图杯获奖作品计算机组,“中图杯”第十四届环境地图大赛召开 地图慧成指定制图软件...
2017年"中图杯"第十四届中国青少年环境地图大赛开赛,你准备好了么? 为了让青少年了解地图,学习地图,爱护环境,保护地球,这样的地图大赛是非常有意义的,每一届的比赛都受到非常多的 ...
- 蓝桥杯练习题Java实现 入门训练 Fibonacci数列
蓝桥杯练习题Java实现 入门训练 Fibonacci数列 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,F ...
- 蓝桥杯python组——四平方和
蓝桥杯python组--四平方和 import os import sys import math n=int(input()) sqn=int(math.sqrt(n))def f(n):for a ...
- 【蓝桥杯第十二届省赛】
[蓝桥杯第十二届省赛] #include "reg52.h" #include "onewire.h" #include "iic.h"/* ...
- 蓝桥杯练习题 回文数
蓝桥杯练习题 回文数 问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数. 输出格式 按从小到大的顺序输出满足条件的四位十进制数. #include< ...
- 突击蓝桥杯嵌入式(四)——滴答定时器、按键的三行代码消抖、LCD与ADC
突击蓝桥杯嵌入式(四)--滴答定时器.按键的三行代码消抖.LCD与ADC 1.滴答定时器定时运行 我们利用滴答定时器,让LED每隔1s闪烁一次 //首先我们定义一个变量 __IO uint32_t u ...
- 蓝桥杯第十届省赛java组解析(灵能传输 四星难度,后缀表达式 两星难度)
第一题太简单懒得复制题目了 答案是:490 第二题: 试题 B: 不同子串 本题总分:5 分 [问题描述] 一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串.例如,字符串aa ...
- 蓝桥杯第十届真题B组(2019年)
2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组# 试题 A:组队# 本题总分:5分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容. 每 ...
- 蓝桥杯 第十届 JAVAB组 E迷宫
/*试题 E: 迷宫 本题总分:15 分 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方. 010000 000100 001001 110000 ...
最新文章
- 【STSRM13】绵津见
- 梯度下降法和随机梯度下降法
- 设置Spring 3开发环境
- 15个Java多线程面试题
- php脚本开头注释_PHP文件注释标记及规范小结
- 炼数成金hadoop视频干货03
- 一文读懂kafka(附加52道常见面试题)
- 3.jsp页面分页功能(首页、下一页、上一页、末页)
- 权威发布|2020年11月份全国铝合金模板PMI指数出炉,请查收!
- 传教士与野人过河问题
- 计算机二级 java编程题_计算机等级二级考试辅导:Java IO单元机试题及解答(第2部分)...
- C语言之根据摄氏温度求华氏温度
- 上级目录,同级目录简写【../,./】
- uniapp ->video 黑屏 无时长(新手容易遇到的坑)
- 如何让Chrome在隐身(无痕)模式下使用扩展程序
- html设置打印尺寸,打印尺寸及常用格式尺寸设置 css
- 每天学命令get_pins
- pgSql数据库报错:permission denied for relation 的错误
- 《电商系统后台统计报表模块》需求分析与设计的课程小结
- 表与表之间的关系,修改表,复制表