POJ 1002 电话号码排序查重

本文介绍了一种将字母映射到数字的电话号码转换方法,并实现了电话号码的排序及重复检查功能。通过C++代码示例,展示了如何利用int数组存储电话号码并进行排序输出。
487-3279
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 244239 Accepted: 43320

电话号码除了数字,还有大写字母如下表对应

A, B, and C map to 2 
D, E, and F map to 3 
G, H, and I map to 4 
J, K, and L map to 5 
M, N, and O map to 6 
P, R, and S map to 7 
T, U, and V map to 8 
W, X, and Y map to 9 


电话号码需要排序,因此可存入int型数组a,数组大小可根据输入的电话数量num来声明

	cin >> num;
	int* a = new int[num];


以字符串形式输入至s中,输入与电话号码的对应关系可通过计算得到,代码如下

<pre name="code" class="cpp">		while (k<7)
		{
			if(s[j]>='A' && s[j]<='P')
			{
				a[i] = a[i]*10 + (s[j]-'A')/3 + 2;
				k++;
			}
			else if(s[j]>='R' && s[j]<='Y')
			{
				a[i] = a[i]*10 + (s[j]-'Q')/3 + 7;
				k++;
			}
			else if(s[j]>='0' && s[j]<='9')
			{
				a[i] = a[i]*10 + s[j] - '0';
				k++;
			}
			j++;
		}



可以先排序,再查重,此时相同的排在相邻位置;也可以先查重,将多余的去掉后再排序。

排序用sort就可以了。

最后输出时,由于存为int型的电话数据,要按照如 123-4567 的格式输出,因此要考虑0的情况,输出补零

<span style="font-size:18px;">#include <iomanip>

cout << setw(3) << setfill('0') << a[i-1] / 10000 << '-' << setw(4) << setfill('0') << a[i-1]%10000 << " " << k+1 <<endl;</span>



测试时间超时,查了下别人的代码,发现有一个问题,

在输入时设置

cin.sync_with_stdio(false);
或者将cin 改成 scanf 则不显示超时。。
又学了新知识~~


sync_with_stdio

这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printfstd::cout的时候不发生混乱,将输出流绑到了一起。

sync_with_stdio(false) 的作用是取消缓冲区同步,因为printf()/scanf()是C函数,而cin/cout是C++函数,这些函数需要用到各自的缓冲区,为了防止各自的缓冲区错位,C++默认将C函数和C++函数的缓冲区同步。当你设置成std::ios::sync_with_stdio(false)后C++就会取消同步,这会提高cin/cout的运行速度,代价是不能和printf()/scanf()混用,否则会因不同步而出现问题,所以在这种情况下整个程序切记不可将cin/cout和printf()/scanf()混用

应用

在ACM里,经常出现数据集超大造成 cin TLE的情况。这时候大部分人认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。其实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf之类。

在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。

如下所示:

1
2
3
4
5
6
7
#include <iostream>
int main() 
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    // IO
}


参考来源:

http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.html



代码地址:

https://github.com/jianglj/POJ

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值