日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法--腾讯面试:单词游戏,谁会赢? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目

騰訊算法題-題干如下:

有甲乙兩家伙用一個英語單詞玩游戲(無聊的人還是很多的!!!)。兩個人輪流進行,每個人每次從中刪掉任意一個字母,如果剩余的字母序列是嚴格單調遞增的(按字典序a < b < c <….),那就誰贏。

輸入: 一連串英文小寫字母,長度任意(當然要在計算機能承受的范圍內),保證最開始的狀態(tài)不是一個嚴格單增的序列。

**輸出:**1表示甲可以贏,0表示甲不能贏。

例如: 輸入 bad, 則甲可以刪掉b或者a,剩余的是ad或者bd,他就贏了,輸出1。

又如: 輸入 aaa, 則甲只能刪掉1個a,乙刪掉一個a,剩余1個a,乙獲勝,輸出0。


解法

下面給出我用Java實現(xiàn)的算法,如果大家有其他的實現(xiàn)方法,歡迎跟帖和探討。語言不限。

1)算法邏輯

我的基本實現(xiàn)思路將給定的單詞分成若干個單調遞增的序列,然后按每個序列中包含單詞個數(shù)多少進行遞減排序,也就是說,排在前面的單調遞增序列中包含的字母個數(shù)最少。然后由甲開始從排在前面的遞增序列中選擇一個字母。直到該遞增序列中的字母全部被選中。然后繼續(xù)從下一個遞增序列選擇字母。按著這樣的方法做,直到剩下最后一個單調遞增序列,隨最后選擇了倒數(shù)第二個單調遞增序列中的最后一個字母,誰就贏了。

例如,單詞hela,可以分為三個單調遞增序列:h、el、a。從甲開始選擇。

甲:h

乙:a

由于a是倒數(shù)第二個單調遞增序列的最后一個字母,所以乙贏了。

注意:存儲單調遞增序列的集合中的單調遞增序列必須是按單詞順序放入數(shù)組的。例如上面的例子hela,若拆分為:h,a,el,的順序放入到集合當中,然后我們刪除時,從h(即集合中第一個單調遞增序列開始),則會出現(xiàn)問題,若乙刪除“l(fā)”的話,按這個順序,甲贏,但是此時的單詞是ea,甲并沒有贏。

對于單詞money可以分成三個單調遞增序列:mo、n、ey。排序后:n、mo、ey。

甲:n

乙:m

甲:o

所以甲贏。

代碼如下:

public class Test {// 實現(xiàn)算法的方法,in為一個給定的單詞public static int who(String in){// 基本思路就是找到該單詞中所有遞增的子序列,然后從字符最少的子序列甲乙輪回刪除字母,直到還剩下最后一個子序列為止// 誰刪除了最后一個字母,誰就贏了!// in不能為nullif(in == null)return 0;// 單詞至少需要有一個字母if(in.length() == 0)return 0;in = in.toLowerCase(); // 都變成小寫字母// 所有遞增數(shù)列集合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"));} }

請尊重原創(chuàng),原文地址:https://geekori.com/blogDetails.php?blog_id=14

總結

以上是生活随笔為你收集整理的算法--腾讯面试:单词游戏,谁会赢?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。