蓝桥杯试题集试题总汇(C++)
问题描述
输入n个字符串,比较这些字符串的大小并统计并按字典序输出字符串及出现个数
输入格式
输入的第一行包含一个整数n,表示字符串个数。接下来n行,表示输入的字符串。
输出格式
输出n行,每行包含一个字符串及一个整数,表示字符串及出现个数。
样例输入
5
aab
bbc
aab
sdffg
sgjklsa
样例输出
aab 2
bbc 1
sdffg 1
sgjklsa 1
数据规模和约定
30% l=1
30% l=10
20% l<=100
100% n<=1000,l<=1000
分析
1.一般看到输入n行东东【整数,浮点数,字符……】我们都会想到定义数组以便输入,但好像没有字符串数组哦?此时一个伟大的结构体数组伸出援手。另外要统计字符串出现个数,所以结构体中,我们可以设置字符串和整数以方便记录其个数。
2.对于多个东东比较,我们可以利用C++中的 sort 函数,这里要自定义比较含义。
参考代码
(代码非本人所写:https://blog.csdn.net/weixin_44575764/article/details/108029235)
#include<iostream>
#include<algorithm>
using namespace std;
struct Node{
string str;
int num;
};
//自定义比较含义
bool cmp(struct Node a,struct Node b){
return a.str < b.str;
}
int main(){
struct Node node[1000];
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>node[i].str;
node[i].num=1;
}
//排序
sort(node,node+n,cmp);
//去重
for(int i=0;i<n;){
int p=i+1;//i指向的为被比较的主元素,p指向i的后一个元素
while(node[p].str == node[i].str&&p<n){
node[i].num++;
node[p].num=0;//另这些重复的元素的num为0,便于后面的输出判断
p++;//p指向下一个
}
i=p;//令i的值为下一个要比较的元素的下标值
}
//输出结果
for(int i=0;i<n;i++){
if(node[i].num!=0)
cout<<node[i].str<<' '<<node[i].num<<endl;
}
return 0;
}
备注:代码没啥问题,但是提交未通过,看了一下评测点
第一个测评点:输入:空白 输出:295443
第四个测评点:输入:空白 输出:0
第五个测评点:输入:
42 18468 6335
19170 26501 15725
11479 29359 26963
5706 24465 28146
16828 23282 9962
492 2996 11943
4828 5437 32392
3903 14605 154
293 12383 17422
18717 19719 19896
输出:
65741
其他测评点输入输出也都是整数。
所以这是个驴唇不对马嘴的测评。