算法--腾讯面试:单词游戏,谁会赢?

这是一道腾讯面试中的算法题,题目要求在给定的英文单词中,两个玩家轮流删除字母,目标是使得剩余字母形成严格单调递增序列。文章介绍了Java实现的解决方案,首先将单词拆分为单调递增序列并排序,然后按照序列长度选择字母,最后剩下一个序列时,最后一个删除倒数第二个序列最后一个字母的玩家获胜。通过示例解释了算法逻辑,例如单词'hela'和'money'的处理过程。
摘要由CSDN通过智能技术生成

题目

腾讯算法题-题干如下:

有甲乙两家伙用一个英语单词玩游戏(无聊的人还是很多的!!!)。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序a < b < c <….),那就谁赢。

输入: 一连串英文小写字母,长度任意(当然要在计算机能承受的范围内),保证最开始的状态不是一个严格单增的序列

**输出:**1表示甲可以赢,0表示甲不能赢。

例如: 输入 bad, 则甲可以删掉b或者a,剩余的是ad或者bd,他就赢了,输出1。

又如: 输入 aaa, 则甲只能删掉1个a,乙删掉一个a,剩余1个a,乙获胜,输出0。


解法

下面给出我用Java实现的算法,如果大家有其他的实现方法,欢迎跟帖和探讨。语言不限。

1)算法逻辑

我的基本实现思路将给定的单词分成若干个单调递增的序列,然后按每个序列中包含单词个数多少进行递减排序,也就是说,排在前面的单调递增序列中包含的字母个数最少。然后由甲开始从排在前面的递增序列中选择一个字母。直到该递增序列中的字母全部被选中。然后继续从下一个递增序列选择字母。按着这样的方法做,直到剩下最后一个单调递增序列,随最后选择了倒数第二个单调递增序列中的最后一个字母,谁就赢了。

例如,单词hela,可以分为三个单调递增序列:h、el、a。从甲开始选择。

甲:h

乙:a

由于a是倒数第二个单调递增序列的最后一个字母,所以乙赢了。

注意:存储单调递增序列的集合中的单调递增序列必须是按单词顺序放入数组的。例如上面的例子hela,若拆分为:h,a,el,的顺序放入到集合当中,然后我们删除时,从h(即集合中第一个单调递增序列开始),则会出现问题,若乙删除“l”的话,按这个顺序,甲赢,但是此时的单词是ea,甲并没有赢。

对于单词money可以分成三个单调递增序列:mo、n、ey。排序后:n、mo、ey。

甲:n

乙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值