该题思路非常简单,三步:
(1)想方设法去掉‘-’字符;
(2)将字母转化成为对应的数字,注意对含有Q、Z这两个字符的处理,以及连续多个‘-’字符的处理(自己在这两个地方弄了好长时间,最后发现其实挺简单的哈);
(3)调用系统排序函数进行排序,输出格式化。
下面的代码是将自己原始的代码整理后所得,为了给大家一个清晰地代码:
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
map<string,int> Map;
int n;
cin>>n;
string* s_arr=new string[n];
int count=0;
for(int k=0;k<n;++k)
{
string str;
cin>>str;
bool flag=false; //对含有Q、Z字符的处理
//处理'-'字符,并作字母向数字的转换
for(string::iterator iter=str.begin();iter!=str.end();++iter)
{
while('-'==(*iter)&&iter!=str.end())
{
str.erase(iter);
if(iter==str.end())
iter--;
}
if((*iter)>='A'&&(*iter)<='Z')
{
switch(*iter)
{
case 'A':
case 'B':
case 'C': (*iter)='2'; break;
case 'D':
case 'E':
case 'F': (*iter)='3'; break;
case 'G':
case 'H':
case 'I': (*iter)='4'; break;
case 'J':
case 'K':
case 'L': (*iter)='5'; break;
case 'M':
case 'N':
case 'O': (*iter)='6'; break;
case 'P':
case 'R':
case 'S': (*iter)='7'; break;
case 'T':
case 'U':
case 'V': (*iter)='8';break;
case 'W':
case 'X':
case 'Y': (*iter)='9'; break;
default:
flag=true;
break;
}
}
}
string::iterator it=str.end()-1;
if('-'==(*it))
str.erase(it);
if(!flag)
{
s_arr[count]=str;
Map[s_arr[count]]++;
count++;
}
}
sort(s_arr,s_arr+count);
bool flag_1=false;
for(int i=0;i<count;++i)
{
if(Map[s_arr[i]]>1)
{
int num=Map[s_arr[i]];
Map[s_arr[i]]=0;
s_arr[i].insert(3,"-");
flag_1=true;
cout<<s_arr[i]<<" "<<num<<endl;
}
}
if(!flag_1)
{
cout<<"No duplicates."<<endl;
}
return 0;
}
下面的代码是自己的原始代码,曾经时间超时,曾经wrong answer,经过多次的修改,终于AC了,这个代码比较杂乱,供有兴趣的人参考哈,代码如下:
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
map<string,int> Map;
int n;
cin>>n;
string* s_arr=new string[n];
int count=0;
for(int k=0;k<n;++k)
{
string str;
cin>>str;
bool flag=false; //对含有Q、Z字符的处理
//处理'-'字符,并作字母向数字的转换
for(string::iterator iter=str.begin();iter!=str.end();++iter)
{
while('-'==(*iter)&&iter!=str.end())
{
str.erase(iter);
if(iter==str.end())
iter--;
}
//if('-'==(*iter))
//{
// str.erase(iter);
// while('-'==(*iter))
// {
// str.erase(iter);
// }
// if(iter==str.end())
// break;
//}
if((*iter)>='A'&&(*iter)<='Z')
{
switch(*iter)
{
case 'A':
case 'B':
case 'C': (*iter)='2'; break;
case 'D':
case 'E':
case 'F': (*iter)='3'; break;
case 'G':
case 'H':
case 'I': (*iter)='4'; break;
case 'J':
case 'K':
case 'L': (*iter)='5'; break;
case 'M':
case 'N':
case 'O': (*iter)='6'; break;
case 'P':
case 'R':
case 'S': (*iter)='7'; break;
case 'T':
case 'U':
case 'V': (*iter)='8';break;
case 'W':
case 'X':
case 'Y': (*iter)='9'; break;
default:
flag=true;
break;
}
}
}
string::iterator it=str.end()-1;
if('-'==(*it))
str.erase(it);
if(!flag)
{
s_arr[count]=str;
Map[s_arr[count]]++;
count++;
}
//Map[str]++;
}
sort(s_arr,s_arr+count);
//for(int i=0;i<count;++i)
//{
// Map[s_arr[i]]++;
//}
bool flag_1=false;
//for(map<string,int>::iterator iter=Map.begin();iter!=Map.end();++iter)
//{
// if(iter->second>1)
// {
// flag_1=true;
// string t_str=iter->first;
// t_str.insert(3,"-"); //此处应该仍可优化
// cout<<t_str<<" "<<iter->second<<endl;
// }
//}
for(int i=0;i<count;++i)
{
if(Map[s_arr[i]]>1)
{
int num=Map[s_arr[i]];
Map[s_arr[i]]=0;
s_arr[i].insert(3,"-");
flag_1=true;
cout<<s_arr[i]<<" "<<num<<endl;
}
}
if(!flag_1)
{
cout<<"No duplicates."<<endl;
}
//cout<<str<<endl;
//将所有的字母全部转为对应的数字
// for(int i=0;i<str.length();++i)
// {
// switch(str[i])
// {
// case 'A':
// case 'B':
// case 'C': str[i]='2'; break;
// case 'D':
// case 'E':
// case 'F': str[i]='3'; break;
// case 'G':
// case 'H':
// case 'I': str[i]='4'; break;
// case 'J':
// case 'K':
// case 'L': str[i]='5'; break;
// case 'M':
// case 'N':
// case 'O': str[i]='6'; break;
// case 'P':
// case 'R':
// case 'S': str[i]='7'; break;
// case 'T':
// case 'U':
// case 'V': str[i]='8';break;
// case 'W':
// case 'X':
// case 'Y': str[i]='9'; break;
// default:
// break;
// }
// }
// //cout<<str<<endl;
// Map[str]++;
//}
//输出格式化
//string* s_arr=new string[n];
//int loc=0;
//for(map<string,int>::iterator iter=Map.begin();iter!=Map.end();++iter)
//{
// if(iter->second!=1)
// {
// s_arr[loc]=iter->first;
// loc++;
// }
//}
调用系统函数,对s_arr进行排序
//sort(s_arr,s_arr+loc);
//bool flag=false;
//for(map<string,int>::iterator iter=Map.begin();iter!=Map.end();++iter)
//{
// for(int i=0;i<loc;++i)
// {
// if(s_arr[i]==iter->first)
// {
// flag=true;
// s_arr[i].insert(3,"-");
// cout<<s_arr[i]<<" ";
// cout<<iter->second<<endl;
// }
// }
//}
//if(!flag)
//{
// cout<<"No duplicates"<<endl;
//}
return 0;
}