请教一个算法题:摇骰子, 3 个 1 和两个五一个六比, 3 个 1 获胜这种

2021-08-25 15:03:47 +08:00
 NicholasZhan

楼主今天去面试了,最后的压轴题是: A 和 B 两人摇骰子,一人摇 5 次。要我找出他们俩谁赢了。获胜规则是这样的:相同数字出现最多的获胜,次数相同则数字大的获胜。例如:A 出了 6 个 1,B 出了 5 个 6 和 1 个 5,则 A 获胜。楼主的思路是先统计每人每个数字出现次数,然后按照出现次数和数字本身降序排列。排序规则是这样的,出现次数多的大,次数相同则比较数字。这样就能比较出胜负了。

没想到的是,面试官突然把题目升级了:假设有 5000 个人,每个骰子有 5000 个面,每个人摇 5000 次,还是一样的规则,让我找出获胜者😢。原来的算法肯定是不行的,面试官给的提示是如何遍历一遍就给每个人打个分,然后比较分数,我只想到了权重,出现次数越多权重越大。但是具体的算法还是没能设计出来,听闻 V 站大佬多,特来请教下 ORZ 。

2183 次点击
所在节点    问与答
34 条回复
Encloud
2021-08-25 18:23:01 +08:00
@tyx1703 每人摇 5000 次的话,极端情况就会有 5000 位的超大数
tyx1703
2021-08-25 18:25:53 +08:00
@Encloud 按位放在数组中
wangyongbo
2021-08-25 18:34:59 +08:00
leetcode 上有这道题目吗?
NicholasZhan
2021-08-25 18:50:14 +08:00
@cpstar
@wy315700
@xloger
@binux
@shpkng
@bfdh
@misdake
@tyx1703
@zmxnv123
@lin07hui
@Encloud
@tyx1703 感谢大家的热情解答,进制的解法真的很棒👍
NicholasZhan
2021-08-25 18:51:03 +08:00
@wangyongbo 貌似没有哦😂
cctrv
2021-08-26 01:22:00 +08:00
這種當然做製表啊!

把 111111 - 666666 的組合先窮盡然後按勝利到輸做一個表。

5000 人全部查表就好了。
cctrv
2021-08-26 01:23:39 +08:00
不好意思,5000 面⋯看漏了
lin07hui
2021-08-26 10:40:45 +08:00
@tyx1703
66641: (6+6+6) * 6^5 + (4+1) * 6^0
66631: (6+6+6) * 6^5 + (3+2) * 6^0
这两个相等了,应该是 66641 赢才对
lin07hui
2021-08-26 10:42:27 +08:00
@tyx1703
66641: (6+6+6) * 6^5 + (4+1) * 6^0
66632: (6+6+6) * 6^5 + (3+2) * 6^0
这两个相等了,应该是 66641 赢才对
tyx1703
2021-08-26 11:27:36 +08:00
@lin07hui 确实考虑不周,直接加还是有问题
bdataby11
2021-08-30 14:21:30 +08:00
假设有 5000 个人,每个骰子有 5000 个面(每一面的点数是 1-5000 ),每个人摇 5000 次;获胜规则是这样的:相同数字出现最多的获胜,次数相同则数字大的获胜。
1.把每个人摇五千次的结果先做内部排序,统计出每个数字出现的次数,最后只要记录每个人的相同次数出现最多的数字以及其次数,5 千个人就是 5 千行结果。
2.针对次数对 5 千行结果做排序,找到次数最大的值。如果次数最大的结果有多个,再选出次数最大的
bdataby11
2021-08-30 14:23:07 +08:00
假设有 5000 个人,每个骰子有 5000 个面(每一面的点数是 1-5000 ),每个人摇 5000 次;获胜规则是这样的:相同数字出现最多的获胜,次数相同则数字大的获胜。
1.把每个人摇五千次的结果先做内部排序,统计出每个数字出现的次数,最后只要记录每个人的相同次数出现最多的数字以及其次数(如第五个人 数字 1500 次数 225 ),5 千个人就是 5 千行结果。
2.针对次数对 5 千行结果做排序,找到次数最大的值。如果次数最大的结果有多个,再选出次数最大的
bdataby11
2021-08-30 14:47:42 +08:00
假设有 5000 个人,每个骰子有 5000 个面(每一面的点数是 1-5000 ),每个人摇 5000 次;获胜规则是这样的:相同数字出现最多的获胜,次数相同则数字大的获胜。
1.把每个人摇五千次的结果先做内部排序,统计出每个数字出现的次数,最后只要记录每个人的相同次数出现最多的数字以及其次数(如第五个人 数字 1500 次数 225 ),5 千个人就是 5 千行结果。
2.针对次数对 5 千行结果做排序,找到次数最大的值。如果次数最大的结果有多个,再选出次数最大的


答主有些情况都没说明,每个骰子有 5000 个面,那它每一面的点数如果范围是 1-6,那是没有意义的,应该是 1-5000 比较合理。
还有个问题要考虑到,比如最终结果为[数字 1500 次数 300]的人数有两个人 a b
这时候就得取 a b 两个的 top2 做规则 [相同数字出现最多的获胜,次数相同则数字大的获胜] 比较,如果 ab 的 top2 都相等,要继续比较 top3 top4 ...topn 等等。
最最最极端的情况,5000 个人的 top1 和 topn 都相等
@NicholasZhan 大佬说的斗地主中的炸弹就差不多,我刚开始只考虑到 top1 的情况,但是如果 top1 相等的有多个,就要继续往下比较了。
NicholasZhan
2021-08-30 16:13:38 +08:00
@bdataby11 嗯,是我漏了条件,5000 面的骰子点数是 1-5000,感谢指出

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/797934

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX