POJ[1002]487-3279

  • 如果相邻号码相同
    • 次数times前后累加
  • 如果相邻号码不同
    • 上一个号码次数不为1:输出
    • 上一个号码次数为1:不输出

注意:以上逻辑总不会显示(输入的)最后一个重复号码,要单独判断


#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
char arr[26]={'2','2','2',
'3','3','3',
'4','4','4',
'5','5','5',
'6','6','6',
'7','7','7','7',
'8','8','8',
'9','9','9','9'};
struct phoneNum
{
    phoneNum(string str="",long time=1){
        this->num=str;
        this->times=time;
    };
    string num;
    long times;
};
void handleStr(string& str);
bool comp(const phoneNum& n1,const phoneNum& n2){
    return n1.num<n2.num;
}
int main()
{
    long n;
    cin>>n;
    std::vector<phoneNum> v(n);
    string str;
    for (int i = 0; i < n; ++i)
    {
        cin>>v[i].num;
    }
    for (int i=0;i<n;i++)
    {
        handleStr(v[i].num);
    }
    sort(v.begin(),v.end(),comp);
    bool have=0;
    for (int i=1;i<n;i++)
    {
        if (v[i].num==v[i-1].num)
        {
            have=1;
            v[i].times=v[i].times+v[i-1].times;
        }
        else if(v[i-1].times!=1){
            cout<<v[i-1].num<<' '<<v[i-1].times<<endl;
        }
    }
    if (have!=1)
    {
        cout<<"No duplicates."<<endl;
    }
    // 如果所有数字都相同,以上逻辑有错
    if (v[n-1].times!=1)
    {
        cout<<v[n-1].num<<" "<<v[n-1].times<<endl;
    }
    return 0;
}

void handleStr(string& str)
{
    for (int i=0;i<str.size();i++)
    {
        if (str[i]=='-')
        {
            str.erase(i,1);
            i--;
        }
        else if(!('0'<=str[i]&&'9'>=str[i])){
            str[i]=arr[int(str[i]-'A')];
        }
    }
    str.insert(3,"-");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值