poj 1002 电话号码查重

虽然网上都说这是一道水题,其实我也感觉这题思路满清晰的,但死活提交不通过,基本都是时间超了,后来勉强痛过了,但效果还是不怎么理想。这里做一个简单分析

1.我们一开始的程序是利用stl中的vector,string 等容器读入数据,然后自己写了一个快速排序的算法,对存储在vector<string>中的string串进行排序,可想而知,对字符串排序的效率是有多滴,尤其面对这道题这么变态的测试数据的时候。

2.我们后来将数据存到vector<int>中去,有效果,在测试bt的数据的时候,过了10s终于出来结果了,这是对快速排序对象的改善。但poj不接受。

3.后来,经过实验室师兄解释,vector,string 都会自动分配内存,并自动增长,但这里是对时间有要求的,对100000组数据而言,vector分配几次内存,显然不可接受,于是,我们就不能装B的使用容器了,开始转化用数组。

4.这里其实可以用快速排序实现,但是我们脑抽了,想到hash表蛮好的,就使用了hash表进行处理,但是服务器不支持用hash_map 编译不通过,于是我们换用map

5.输出格式是有要求的,如果使用string或char【】数组来输出,没有问题,但如果要用cout输出,就需要进行格式控制了。这里参考文章:http://blog.csdn.net/onlyou930/article/details/6638896


Source Code

Problem: 1002 User: zhyh2010
Memory: 3520K Time: 1204MS
Language: C++ Result: Accepted



#include <iostream>
#include <map>
#include <iomanip>

using namespace std;

class PhoneNUM
{
public:
	PhoneNUM();
	~PhoneNUM();

	void input();
	void output();

protected:
	void initmap();

private:
	//int m_data[100001];
	char m_input[50];
	//char m_input[20];
	
	size_t m_size;
	
	map<char, char> m_map;
	map<int, int> m_dict;
};

PhoneNUM::PhoneNUM()
{
	m_size = 0;
	initmap();
}

PhoneNUM::~PhoneNUM()
{
}

void PhoneNUM::input()
{
	//cout << "input the number of the phones:\t" << endl;

	cin >> m_size;

	//string phone;
	
	for (int i = 0; i != m_size; ++i )
	{

		cin >> m_input;

		//handlePhone(phone);
		int j = 0;
		int temp = 0;
		int res = 0;
		while (m_input[j] != '\0')
		{
			if (m_input[j] == '-')
			{
				++j;
				continue;
			}

			if (m_input[j] >= '0' && m_input[j] <= '9')
			{
				temp = m_input[j] - '0';
			}
			else
			{
				temp = m_map[m_input[j]];
			}

			res = 10 * res + temp;
			++j;
		}

		//m_data[i] = res;

		// dict handle
		if (m_dict.count(res) == 0)
		{
			m_dict[res] = 1;
		}
		else
		{
			++m_dict[res];
		}
		
	}
}

void PhoneNUM::output()
{
	bool isdul = false;
	map<int, int>::const_iterator iter = m_dict.begin();
	for (; iter != m_dict.end(); ++iter)
	{
		if (iter->second > 1)
		{
			isdul = true;
			cout << setfill('0') << setw(3) << iter->first / 10000 << "-"
				<< setfill('0') << setw(4) << iter->first % 10000 <<" "<< iter->second << endl;
		}
	}
	if (isdul == false)
	{
		cout << "No duplicates." << endl;
	}
}

void PhoneNUM::initmap()
{
	m_map['A'] = 2;
	m_map['B'] = 2;
	m_map['C'] = 2;
	m_map['D'] = 3;
	m_map['E'] = 3;
	m_map['F'] = 3;
	m_map['G'] = 4;
	m_map['H'] = 4;
	m_map['I'] = 4;
	m_map['J'] = 5;
	m_map['K'] = 5;
	m_map['L'] = 5;
	m_map['M'] = 6;
	m_map['N'] = 6;
	m_map['O'] = 6;
	m_map['P'] = 7;
	m_map['R'] = 7;
	m_map['S'] = 7;
	m_map['T'] = 8;
	m_map['U'] = 8;
	m_map['V'] = 8;
	m_map['W'] = 9;
	m_map['X'] = 9;
	m_map['Y'] = 9;

}

int main(int argc, char**argv)
{
	PhoneNUM instance;
	instance.input();
	//instance.quicksort();
	instance.output();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值