Poj--1002 (字符串处理)
2014-05-28 17:07:18
题目链接:http://poj.org/problem?id=1002
题意:给出一些strings,按照手机按键的规则将其转化,得到standard strings,按字典序将其输出,并输出出现次数(只1次的不输出)。题目不难,但要想到将不长的string转化成整数的思路,并且
在判断时 for(int j = i + 1; v[i] == v[j] && j < n; j++) 语句中v[i] == v[j]语句很重要,保证只遍历到最后一个相同的v[j],而不遍历全部,节省时间,防止超时。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; char s[20]; int v[1000005]; int main(){ int map[128]; memset(v,0,sizeof(v)); memset(map,0,sizeof(map)); int n,len; //init map['A'] = map['B'] = map['C'] = 2; map['D'] = map['E'] = map['F'] = 3; map['G'] = map['H'] = map['I'] = 4; map['J'] = map['K'] = map['L'] = 5; map['M'] = map['N'] = map['O'] = 6; map['P'] = map['R'] = map['S'] = 7; map['T'] = map['U'] = map['V'] = 8; map['W'] = map['X'] = map['Y'] = 9; scanf("%d",&n); for(int i = 0; i < n; i++){ scanf("%s",s); for(int j = 0; s[j] != '\0'; j++){ if(s[j] >= 'A' && s[j] <= 'Z'){ v[i] = v[i] * 10 + map[s[j]]; } else if(s[j] >= '0' && s[j] <= '9'){ v[i] = v[i] * 10 + s[j] - '0'; } } } sort(v,v + n); int ok = 0; for(int i = 0 ; i < n; i++){ int cnt = 0; for(int j = i + 1; v[i] == v[j] && j < n; j++){ ++cnt; } if(cnt){ ok = 1; printf("%03d-%04d %d\n",v[i] / 10000,v[i] % 10000,cnt + 1); } i += cnt; } if(!ok){ printf("No duplicates.\n"); } return 0; }

浙公网安备 33010602011771号