| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4321 人关注过本帖
标题:电话号码问题(我保证很难)
取消只看楼主 加入收藏
youxiaxyz
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-4-5
收藏
 问题点数:0 回复次数:3 
电话号码问题(我保证很难)

这道题主要问题是内存限制和运行时间问题,是我们上机的原题,是不是很有难度?哪位高手能解决一下啊!推荐看《编程珠玑》
背景

商业单位需要容易记忆的电话号码,有一些方法可以让电话号码变得更容易记忆。譬如,可以把电话号码写成单词或短语,如 TUT-GLOP 可以代表滑铁卢大学的电话。有时仅仅是把号码的一部分写成单词,如打 310-GINO 便可向 GINO 比萨饼店定购比萨。另一种让电话号码容易记忆的方法是将数字用一种容易记的方式组合起来,譬如 3-10-10-10 也可以代表 GINO 比萨饼店。

电话号码的标准形式是七位十进制数字,在它的第三位和第四位之间用连字符连接(例如:888-1200)。电话的键盘提供了字符于数字之间的映射关系,如下所示:

2

A、B和C
3

D、E和F
4

G、H和I
5

J、K和L
6

M、N和O
7

P、R和S
8

T、U和V
9

W、X和Y

Q 和 Z 没有映射到键盘,而连字符不需要被拨打并且可以根据需要添加和删除。TUT-GLOP 的标准形式是 888-4567,310-GINO 的标准形式是310-4466,3-10-10-10的标准形式也是 310-1010。

如果两个电话号码有相同的标准形式,那么这两个电话号码是相同的。

你所在的公司正在编辑一本当地商业单位的电话簿,作为质量控制流程的一部分,你需要确认在该电话簿中没有两个(或两个以上的)商业单位使用相同的电话号码。

输入

一次输入为一个样例。输入的第一行用一个正整数指明了电话簿中电话号码的数目 n(最大为1,000,000)。后面输入 n 个电话号码,每个号码一行。每个号码由一组包含十进制数、大写字母(Q、Z 除外)和连字符的字符串组成。确切地说,字符串中的七个字符是数字和字母。你可以假设输入中可能重复的电话号码不超过 10,000 个,且每个电话号码重复的次数不超过 100 次。

输出

对每一个在电话簿中以任何形式出现一次以上的电话号码,生成一行输出。这一行应以标准形式给出电话号码,其后跟随一个空格,空格后跟随电话号码在电话簿中出现的次数。所有重复的电话号码输出行应以号码的升序排列。如果在输入中没有重复的电话号码,则输出:“No duplication”。

注意

你所编写的程序只是一个大系统的一部分,它的运行速度应该非常快且应当不占用过多的内存。本题内存限制为 1.5M。

测试用例 0
测试输入
1 12
2 4873279
3 ITS-EASY
4 888-4567
5 3-10-10-10
6 888-GLOP
7 TUT-GLOP
8 967-11-11
9 310-GINO
10 F101010
11 888-1200
12 -4-8-7-3-2-7-9
13 487-3279
期待的输出
1 310-1010 2
2 487-3279 4
3 888-4567 3
时间限制 1秒
内存限制 1536KB
搜索更多相关主题的帖子: 电话号码 
2006-05-26 21:29
youxiaxyz
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-4-5
收藏
得分:0 
看不清楚,请点击下面的运行代码
2006-05-26 21:32
youxiaxyz
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-4-5
收藏
得分:0 
的确很能拓展思路,大家不妨练一练
2006-05-26 21:34
youxiaxyz
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用–★–在2006-5-27 5:16:00的发言:
可行性分析:
1。连字符位置固定,信息量为零。可在输出阶段搞定。
2。七位号码最大9999999,小于256的立方,宜用自定义的长度为3字节的“无符号整型u3”表示之。反之,如果用字符数组char[7~8]表示,一则内存开销大一倍以上,二则排序速度也劣于整数比大小。
3。依题意,独立的电话号码数不超过10000个,每个号码的重复次数不超过100。因此可定义如下的无名结构数组解决问题:
struct {
unsigned short low2;
unsigned char high1;//二者联合起来充当u3类型
unsigned char times;//记录重复次数
} NB[10000];
4。庞大的输入数据分批读入内存,以减少内存开销。
5。关于填充NB[]数据库的初步考虑
⑴折半查找过程(找到则times++否则)
⑵插入排序过程(此环节速度怕有问题)
6。[补充]实际上用long int存放号码也完全可行。
7。[自评]本方案可能在速度上难以达到额定要求。

题目是说可能重复的号码不超过10000,并不是说独立的号码

2006-05-27 08:58
快速回复:电话号码问题(我保证很难)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056038 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved