算法笔试题:诚实村与谎言村
一天,你跟随渔夫出海打鱼,在海上遇到了大风浪而迷失了方向,小船被刮到了一座小岛上。岛上有两个相邻的村子,一个叫诚实村,一个叫谎言村,诚实村的村民只会说真话,从不撒谎,而谎言村的村民则只说谎话,从不说真话。所以你决定想办法区分出这不同的两组人,弄清楚谁说的是真话,这样才能够找到回去的方向。这两个村的村民很热情,有问必答,你要求每位村民给你一份他们认为是说谎者的名单。这些村民世世代代都生活在这里,所以他们非常清楚谁在说谎。但是为了不得罪人,每位村民勉强地只给了你一份不全的名单,当然这些名单也不能尽信。
你必须编写一个程序来筛选你所收集到的这些信息,并判断哪些村民是在说真话,哪些村民是在说谎话。两个村的村民人数很多,所以你的程序必须能快速并有效的处理大量数据。
输入规范你的程序必须获取一个唯一的命令行参数,即文件的名称。打开文件并且解析里面的数据。这些数据以村民的数量 n 开头,行尾另起一新行。后面跟着是连续的 n 块信息,每块信息描述的是一个村民所举报的那些说谎者名单。每一块的格式如下:
<accuser name> <m>(其中:accuser name 表示举报人名字,m 表示被举报说谎的人数。)
而后紧跟 m 行,每一行包含一个被举报的人员名字。accuser name 和 m 被一些制表符(tab)和空格隔开。m 总是在 [0, n] 区间。所有人员的名字只包含字母且是唯一的并区分大小写。
输入文件示例:
5
Stephen 1
Tommaso
Tommaso 1
Galileo
Isaac 1
Tommaso
Galileo 1
Tommaso
George 2
Isaac
Stephen
输出规范你的程序输出必须由两个数字组成,数字之间由一个空格隔开,结尾另起一新行(换行符为 "\n"),打印至标准输出。第一个数字是说谎者和诚实者中人数较多的一组人数; 第二个数字是人数较少的一组人数。我们保证这些测试数据只有一个正确的解决方法。
输出示例如下: 3 2
这是一家公司贴在网上的笔试题,我觉得有问题,如果按我下面的测试数据根本推不出说谎者小组或者诚实者小组的人数。
test.txt:
6
A 2
B
C
B 1
A
C 1
A
D 2
E
F
E 1
D
F 1
D
因为ABC与DEF根本属于两个毫无关联的关系网,只能确定A与BC不在一组,也能确定D与EF不在一组,但是A与DEF的关系却确定不了。因此人数也不能确定 因为不知道A 跟另一个关系网里面的D是一组 还是EF是一组。
我跟他们公司的技术人员联系沟通后,他们解释是已经说明了”我们保证这些测试数据只有一个正确的解决方法。“, 不过我还是觉得这个题目本身是错误的。。。。
------解决方案--------------------他们的工资有几十K一个月?如果没有就不要费这个脑筋想了。呵呵
------解决方案--------------------题目,都没看懂,如果是英文题目,更看不懂
------解决方案--------------------- -这个 我的方法非常简单粗暴
两个hashset
比如是是A and B
1.把第一步的举报人放在A 被举报人放在B
2.然后往下读 一个循环 检查举报人的姓名是否在A表中 如果是 则把被举报人全部放在B表
3.然后再循环 检查举报人名单时都在B表中 如果是 怎么被举报人全部放进A表
4.重复2和3,知道数据全部进入两个表
5.比较A和B的元素个数 个数大的在前 小的在后 输出
------解决方案--------------------这个试题其实是个文字游戏 你根本不需要知道他们是否说谎
你只需要得出每个组的人数就OK了……
------解决方案--------------------、
还只是资格啊?