首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【String+Map版】从poj 1002——487-3279的STL做法跟若干陷阱来分析MAP

2013-01-26 
【String+Map版】从poj 1002——487-3279的STL做法和若干陷阱来分析MAP题目:点击打开链接求重复的号码东西。第

【String+Map版】从poj 1002——487-3279的STL做法和若干陷阱来分析MAP

题目:点击打开链接

求重复的号码东西。第一反应就是MAP(他们有用hash做的),写起来也很顺(我指针弱渣)实际应用的时候却发现了一些陷阱,导致了若干次的wa.

原理很简单:打表,转化成数字,忽略横杠,添加到MAP里,根据MAP自动管理的特性(自动保持升序,自动开内存++等)输出重复的次数。

但陷阱也挺麻烦,可能和我略奇葩的思维有关【String+Map版】从poj 1002——487-3279的STL做法跟若干陷阱来分析MAP

1、删除横杠。

下面的代码,看上去很对有木有??删除横杠啊~

错解1:

#include <string>#include <map>#include <algorithm>#include <ctype.h>#include <stdlib.h>#include <iostream>using namespace std;map<string,int> phonepack;string phonecall(string tar){string res;for(int i=0;i<tar.size();i++){if(tar[i]=='A' || tar[i]=='B' || tar[i]=='C')tar.replace(i,1,"2");else if(tar[i]=='D' || tar[i]=='E' || tar[i]=='F')tar.replace(i,1,"3");else if(tar[i]=='G' || tar[i]=='H' || tar[i]=='I')tar.replace(i,1,"4");else if(tar[i]=='J' || tar[i]=='K' || tar[i]=='L')tar.replace(i,1,"5");else if(tar[i]=='M' || tar[i]=='N' || tar[i]=='O')tar.replace(i,1,"6");else if(tar[i]=='P' || tar[i]=='R' || tar[i]=='S')tar.replace(i,1,"7");else if(tar[i]=='T' || tar[i]=='U' || tar[i]=='V')tar.replace(i,1,"8");else if(tar[i]=='W' || tar[i]=='X' || tar[i]=='Y')tar.replace(i,1,"9");}/*string::iterator it;for(it=tar.begin();it!=tar.end();it++)  //不加这一句可能会导致系统读取非法内存,因为删除了标识符就没了,-有很多会出错 {if((*it)=='-'){tar.erase(it);  cout<<tar<<endl;}}*/for(int p=0;p<tar.size();p++){if(isdigit(tar[p]))res+=tar[p];}return res;}int main(){int testcase;map<string,int>::iterator it2;cin>>testcase;for(int i=0;i<testcase;i++){string region;string conv;cin>>region;conv=phonecall(region);map<string,int>::iterator apper=phonepack.find(conv);if(apper==phonepack.end()){ phonepack.insert(map<string,int>::value_type(conv,1));}else{phonepack[conv]++;}}int pos=0;//初始化,又WA一次 for(it2=phonepack.begin();it2!=phonepack.end();it2++){if((*it2).second>1)   //输出格式比较麻烦 {for(int i=0;i<=2;i++)cout<<(*it2).first[i];cout<<"-";for(int j=3;j<=6;j++)cout<<(*it2).first[j];cout<<" "<<(*it2).second<<endl;pos++;}}if(pos==0){cout<<"No duplicates."<<endl;}return 0;}


1楼zuojx1013昨天 11:40
哇塞!好详细啊,这题做了好几个星期了,一直没有搞明白,看到大神的文章,受益匪浅啊!!!!膜拜有木有!!!求联系方式,求交往啊!!!
Re: zuojx1013昨天 11:42
回复zuojx1013n嘿嘿

热点排行