题意:
输入n个字符串,每个字符串出去‘-’外只有7个字符,每个英文字母都有对应映射,请将输入字符串中标准电话号码出现次数大于1的输出
**Q与Z不会出现,so无map
于是构建映射^_^用map
首先解释公式 >o<:
x=x*10+(c-‘A’-(c>’Q’))/3+2
(c>’Q’)返回的是bool值1或0,于是如果输入字母为Q之后的字母向前移一位。
(c-‘A’-(c>’Q’))/3为什么要除以3呢(⊙o⊙)?
因为题目中三个字母对应一个映射
(c-‘A’-(c>’Q’))/3+2
为什么要+2呢 >o<
因为映射第一个数字是2
#include<cstdio>
#include<map>
using namespace std;
map <int,int> s;
int main(){
int n;
scanf("%d",&n);
char c;
//映射构建
for(int i=1;i<=n;i++){//n个字符串
int x=0;//x代表电话号码
for(int cnt=1;cnt<=7;){//每个字符串只有7个字符
scanf("%c",&c);
if(c>='A'&&c<='Z'){//如果输入的是字母,进行转换
x=x*10+(c-'A'-(c>'Q'))/3+2;//(c>'Q)返回的是bool(1or0)
cnt++;
}
else if(c>='0'&&c<='9'){
x=x*10+c-'0';
cnt++;
}
}
s[x]++;//电话号码对应映射+1
}
bool visi=false;
for(map<int,int>::iterator it=s.begin();it!=s.end();++it){//你写it++也无所谓啦
if(it->second>1){
printf("%03d-%04d %d\n",it->first/10000,it->first%10000,it->second);
//%03d代表输出三个整数,不够补0
visi=true;
}
}
if(visi==false)
printf("No duplicates.\n");
return 0;
}
本文介绍了一种通过构建映射关系来识别并统计标准电话号码出现频率的方法。使用C++实现,针对输入的字符串,去除特殊字符“-”,将每个包含7个有效字符的字符串映射成电话号码,并统计出现次数超过一次的电话号码。

被折叠的 条评论
为什么被折叠?



