程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [String+Map版]從poj 1002——487-3279的STL做法和若干陷阱來分析MAP

[String+Map版]從poj 1002——487-3279的STL做法和若干陷阱來分析MAP

編輯:C++入門知識

求重復的號碼東西。第一反應就是MAP(他們有用hash做的),寫起來也很順(我指針弱渣)實際應用的時候卻發現了一些陷阱,導致了若干次的wa.   原理很簡單:打表,轉化成數字,忽略橫槓,添加到MAP裡,根據MAP自動管理的特性(自動保持升序,自動開內存++等)輸出重復的次數。   但陷阱也挺麻煩,可能和我略奇葩的思維有關   1、刪除橫槓。   下面的代碼,看上去很對有木有??刪除橫槓啊~   錯解1:   [cpp]   string::iterator it;           for(it=tar.begin();it!=tar.end();it++)          {           if((*it)=='-')           {               tar.erase(it);             }       }   但是如果用這句來刪除橫槓,會報非法內存,為什麼呢?不信你寫個123-4-5-6--7--試試。即防不住兩個橫槓,也防不住最後的橫槓,刪著刪著就出緩沖區了。。 正解,用別的字符串res存不就行了。。   [cpp]   for(int p=0;p<tar.size();p++)   {       if(isdigit(tar[p]))           res+=tar[p];   }     2、兩種存入方式。 錯解:無腦用map["1234567"]++存。存這個會報TLE,原理是按重載的運算符[]進行更新的話,會把所有的已知參數都搜索一遍,非常麻煩。   正解:分情況討論   [cpp]  map<string,int>::iterator apper=phonepack.find(conv);           if(apper==phonepack.end())           {                phonepack.insert(map<string,int>::value_type(conv,1));           }                      else           {               phonepack[conv]++;             }     3、注意沒輸出的情況,這個純讀題問題。 綜合以上情況,終於能AC了,雖然也有點卡時間 1700/2000 MS...   [cpp]  #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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved