poj 1002 487-3279(参考YSQ)

本文介绍了一种通过构建映射关系来识别并统计标准电话号码出现频率的方法。使用C++实现,针对输入的字符串,去除特殊字符“-”,将每个包含7个有效字符的字符串映射成电话号码,并统计出现次数超过一次的电话号码。

题意:
输入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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值