题目

腾讯算法题-题干如下:

有甲乙两家伙用一个英语单词玩游戏(无聊的人还是很多的!!!)。两个人轮流进行,每个人每次从中删掉任意一个字母,如果剩余的字母序列是严格单调递增的(按字典序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

乙:m

甲:o

所以甲赢。

代码如下:

public class Test
{//  实现算法的方法,in为一个给定的单词public static int who(String in){//  基本思路就是找到该单词中所有递增的子序列,然后从字符最少的子序列甲乙轮回删除字母,直到还剩下最后一个子序列为止//  谁删除了最后一个字母,谁就赢了!//  in不能为nullif(in == null)return 0;//  单词至少需要有一个字母if(in.length() == 0)return 0;in = in.toLowerCase();   //  都变成小写字母//  所有递增数列集合java.util.List ascendingList = new java.util.ArrayList();char lastChar = in.charAt(0);StringBuilder sb = new StringBuilder();  // 存储当前递增的字符列表sb.append(lastChar);for(int i = 1; i < in.length(); i++){//  当前字符属于当前的递增序列if(in.charAt(i) > lastChar){sb.append(in.charAt(i));}//  当前字符属于下一个递增序列,所以需要存储上一个递增序列else{ascendingList.add(sb);sb = new StringBuilder(); sb.append(in.charAt(i));}lastChar = in.charAt(i);}if(sb.length() > 0){ascendingList.add(sb);}//  下面就开始游戏了//  从甲开始删字母,从字符最少的递增序列开始删除第一个字母,直到之后只剩下一个递增序列为止,谁删除的最后一个之母,谁就赢了//  这里本应该判断如果单词本身就是递增序列,那么甲就win了,不过既然题目说没有这种情况,所以就注释掉了/*if(ascendingList.size() == 1){return 1;}*/java.util.Collections.sort(ascendingList, new java.util.Comparator(){@Overridepublic int compare(StringBuilder sb1, StringBuilder sb2){if(sb1.length() > sb2.length()){return 1;}else if(sb1.length() == sb2.length()){return 0;}else {return -1;}}});int win = 0;   //  1代表甲赢,0代表乙赢while(ascendingList.size() > 1){if(win == 0)win = 1;    //  甲开始elsewin = 0;    //  乙开始//  删除第一个递增序列的第一个字母,如果该递增序列ascendingList.get(0).delete(0, 1);if(ascendingList.get(0).length() == 0){ascendingList.remove(0);}}return win;}public static void main(String[] args){System.out.println(who("money"));}
}

请尊重原创,原文地址:https://geekori.com/blogDetails.php?blog_id=14

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

  1. 2012九月十月腾讯,网易游戏,百度最新校园招聘笔试题

    十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦(第271-330题) 引言 此文十月百度,阿里巴巴,迅雷搜狗最新面试十一题已经整理了最新的面试题70道,本文依次整理腾讯,网易游戏,百度等各大公司最 ...

  2. 推荐收藏 | 算法工程师常见面试问题及相关资料汇总

    关注上方"视学算法",选择"星标公众号", 关键时间,第一时间送达! 编辑:数据派THU Github传送门: https://github.com/lcylm ...

  3. 标 题: 腾讯面试题目(PHP程序员)

    发信人: max19830115 (max), 信区: Programming 标  题: 腾讯面试题目(PHP程序员) 发信站: 水木社区 (Mon Apr 18 16:26:07 2011), 站 ...

  4. 十月下旬腾讯,网易游戏,百度盛大迅雷校园招聘笔试题集锦(10.25)

    十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦 引言 笔试啊,笔试,面试啊,面试,找工作啊,找工作.此文十月百度,阿里巴巴,迅雷搜狗最新面试十一题已经整理了最新的面试题70道,本文依次整理腾讯,网 ...

  5. 万字长文,小学弟熬夜肝了这份腾讯面试攻略

    本文一万字,以非腾讯在职人的身份,来聊腾讯面试的流程.攻略和建议,但愿能助有缘人. 标题涉及的范围很广,对多数面试腾讯的人而言,都有参考价值,看完本文之后,必有所得. 退一步来讲,即便是准备面试其他公 ...

  6. 万字长文,分享腾讯面试攻略

    本文一万字,以非腾讯在职人的身份,来聊腾讯面试的流程.攻略和建议,但愿能助有缘人. 标题涉及的范围很广,对多数面试腾讯的人而言,都有参考价值,看完本文之后,必有所得. 退一步来讲,即便是准备面试其他公 ...

  7. 2023秋招--腾讯天美--游戏客户端--二面面经

    前言 2023秋招–腾讯天美–游戏客户端–一面面经 二面:9/5 - 30min 面试官提问:20min 自我介绍. 大学学了哪些课程? C#用的多还是C++? 内存对齐了解吗?说下原理以及为什么需要 ...

  8. (建议收藏)算法工程师常见面试问题及相关资料汇总

    目录 算法工程师 Github.牛客网.知乎.个人博客.微信公众号.其他 机器学习 面试问题.资料.代码实战 深度学习 面试.资料.代码实战Pytorch.代码实战TensorFlow.网课 C/C+ ...

  9. 算法工程师常见面试问题及相关资料汇总

    点击上方"AI派",选择"设为星标" 最新分享,第一时间送达! ☞[加薪必备]全套零基础学AI资料免费领! 目录 算法工程师 Github.牛客网.知乎.个人博 ...

最新文章

  1. 从神经科学到计算机视觉:人类与计算机视觉五十年回顾
  2. linux中chmod与chown两个命令详解
  3. GridFS删除文件代码示例
  4. Ionic(ionicframework)一款接近原生的Html5移动App开发框架 中文网
  5. 拿到BAT等大厂offer以后,我发现了关于秋招的一些真相
  6. windows远程下载
  7. vue进入页面执行的钩子函数_解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题...
  8. ViewPager与Tab结合使用
  9. acm的STL容器之队列篇 及 UVa 11292 - Dragon of Loowater 小根堆解法(贪心算法)
  10. 企业五年后卓越或者死亡,数据战略是关键!
  11. 谁是杨强?首位AAAI华人主席,身兼5大顶级组织Fellow,也是华为诺亚方舟实验室开创者...
  12. 深度理解PHP执行流程
  13. Android 颜色(不)透明度的使用及项目开发中的心得总结
  14. 太厉害了!java老版手机游戏下载
  15. Mac 截取一个视频中部分片段(命令行方法)
  16. Kettle连接数据库(DB连接)
  17. 有趣的小项目:半个指头大的收音机制作成功 单片机+RDA5807源程序
  18. HTML在网页上不能显示图片问题
  19. 编程语言排行,C# 和 C++ 有望超越C?
  20. (转)回溯法-算法框架及基础

热门文章

  1. python——正则表达式
  2. (chap4 Http状态码) 4XX
  3. 区块链BaaS云服务(10)用友iuap区块链平台
  4. visual studio 2017 和qt 编译 bitcon源代码
  5. 公钥密码--Elgamal
  6. 10-Armv8-A memory model guide
  7. TEE Internal core API介绍(globalplatform)
  8. scrapy框架对接seleniumpipeline数据持久化
  9. go和python计算字节数组sha1
  10. Ubuntu16.04如何换pip源