您的位置:首页 > 其它

poj1002“487-3279”解题报告

2012-08-16 09:06 183 查看
该题思路非常简单,三步:

(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
;
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
;
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
;
//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;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iterator string 优化 c