poj1002 487-3279 (简单字符串处理)

大致题意是首先一个整形变量n表示输入字符串的数量,然后紧跟n行字符串表示的号码,其中字符ABCD……分别映射相应的数字,特别值得注意的是,只有这个号码出现的次数大于1才会在结果中输出,否则输出 No duplicates.

解决这个题用字符传的相应操作的话,可能会超时,浏览好多大牛写的文章,学了一种我感觉比较巧妙的方法处理这个问题。分别将字符串转化成一个7位的整型数字,在判重和计算相同字符串的出现次数时,也想当简单,输出是要注意输出格式,这个很重要!!好了不多说了,直接上代码


#include 
#include 
#include 
#include 
using namespace std;

char str[50];
int times[10000000];
bool vis[10000000];
int out[100000];

int main()
{
	int i, j, n, pos = 0;
	int flag = 0;
	cin >> n;
	memset(vis, false, sizeof(vis));
	memset(times, 0, sizeof(times));
	for(i = 0; i < n; i++)
	{
		cin >> str;
		int sum = 0;
		for(j = 0; str[j] != '\0'; j++)
		{
			if(str[j] == '-' || str[j] == 'Q' || str[j] == 'Z')
				continue;
			else if(str[j] >= '0' && str[j] <= '9')
				sum = sum * 10 + str[j] - '0';
			else
			{
				if(str[j] == 'A' || str[j] == 'B' || str[j] == 'C')
					str[j] = '2';
				else if(str[j] == 'D' || str[j] == 'E' || str[j] == 'F')
					str[j] = '3';
				else if(str[j] == 'G' || str[j] == 'H' || str[j] == 'I')
					str[j] = '4';
				else if(str[j] == 'J' || str[j] == 'K' || str[j] == 'L')
					str[j] = '5';
				else if(str[j] == 'M' || str[j] == 'N' || str[j] == 'O')
					str[j] = '6';
				else if(str[j] == 'P' || str[j] == 'R' || str[j] == 'S')
					str[j] = '7';
				else if(str[j] == 'T' || str[j] == 'U' || str[j] == 'V')
					str[j] = '8';
				else if(str[j] == 'W' || str[j] == 'X' || str[j] == 'Y')
					str[j] = '9';
				sum = sum * 10 + str[j] - '0';
			}
		}
		times[sum]++;
		if(!vis[sum] && times[sum] >= 2)
		{
			flag = 1;
			vis[sum] = true;
			out[pos] = sum;
			pos++;
		}
	}
	if(!flag)
		cout << "No duplicates." << endl;
	else         
	{
		sort(out, out + pos);
		for(i = 0; i < pos; i++)
		{
			printf("%03d-%04d %d\n", out[i] / 10000, out[i] % 10000, times[out[i]]);
		}
	}
	return 0;
}


你可能感兴趣的:(POJ,字符串)