由于是简单题,第二遍做思路比较顺,中间卡了一下,提交时卡第二下。
//原错误答案
const int N = 1e3 + 7;
string s[N];//最开始写成string[N],滑稽
map<string, int >mp;
int main(){
int n;
while (scanf_s("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf_s("%s", s[i]);//卡第二下
mp[s[i]]++;
}
int cnt = 0;
string S;
map<string, int>::iterator it;
for (it = mp.begin(); it != mp.end(); it++) {//卡的第一下
if (cnt <= (*it).second) {
cnt = (*it).second;
S = (*it).first;
}
}
printf("%s",S);//第二下
}
return 0;
}
一.string
只有内置类型可以用scanf,因为string是一个类class,我一开始用string类型参数直接使用scanf,printf输入输出,出错。若要强行使用需用char类型参数,用string还是用cin,cout比较好。
二.思路波动过程
思路在第一下卡了一小会,但还是想起来了迭代器,看来练的不够。虽然想起了迭代器的妙用但开始还是用错了。
for (int i = mp.begin(); i != mp.end(); i++) {//我这样写了,迭代器定义好了还用i干嘛,滑稽
if (cnt <= (*it).second) {
cnt = (*it).second;
S = (*it).first;
}
}
此外,多次输入记得把map清空,我疏忽了。
//修改后
#include<bits/stdc++.h>
using namespace std;
map<string, int >mp;
int main(){
int n;
while (scanf("%d", &n) != EOF) {
if (n == 0)break;
mp.clear();//这步没意识到
string color;
for (int i = 0; i < n; i++) {
cin>>color;
mp[color]++;
}
int cnt = 0;
string S;
map<string, int>::iterator it;
for (it = mp.begin(); it != mp.end(); it++) {
if (cnt <= (*it).second) {
cnt = (*it).second;
S = (*it).first;
}
}
cout<<S<<endl;
}
return 0;
}
做完后忽然想到若气球数目一样输出-1该怎么做,多开一个数组?没细想,略。
在不同气球数量相等的情况下,由于使用了<=运算符,我想不应该输出最后一个迭代器指向的值吗,为何交换输入顺序后还是一个颜色,后想到map按字符串排序了,跟怎么输入没关系。(滑稽)
2020/1/25 -> 2020/2/15