搜狐2016招聘筆試題(扎金花)及答案
題目描述
兩個搜狐的程式設計師加了一個月班,終於放假了,於是他們決定扎金花渡過愉快的假期 。
遊戲規則:
共52張普通牌,牌面為2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小遞增,各四張; 每人抓三張牌。兩人比較手中三張牌大小,大的人獲勝。
對於牌型的規則如下:
1.三張牌一樣即為豹子
2.三張牌相連為順子(A23不算順子)
3.有且僅有兩張牌一樣為對子 豹子>順子>對子>普通牌型 在牌型一樣時,比較牌型數值大小(如AAA>KKK,QAK>534,QQ2>10104) 在二人均無特殊牌型時,依次比較三張牌中最大的。大的人獲勝,如果最大的牌一樣,則比較第二大,以此類推(如37K>89Q) 如二人牌面相同,則為平局。
輸入描述:
輸入兩個字串代表兩個玩家的牌(如”10KQ” “354”),先輸入的作為玩家1,後輸入的作為玩家2
輸出描述:
1 代表 玩家1贏 0 代表 平局 -1 代表 玩家2贏 -2 代表不合法的輸入
輸入例子:
KQ3 3Q9
10QA 6102
5810 7KK
632 74J
10102 K77
JKJ 926
68K 27A
輸出例子:
1
1
-1
-1
1
1
-1
題目完整程式碼如下:
/*
* 檔名:LadFlower.java
* 描述: LadFlower.java
* 修改人:Administrator
* 修改時間:2018年2月23日
* 修改內容:新增
*/
package lin.test.algorithmProblem;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 扎金花.
*
* @author Administrator
*/
public class LadFlower {
/**
* 測試主方法.
*
* @param args
* 引數
*/
public static void main(String[] args) {
String aString = args[0];
String bString = args[1];
System.out.println(new LadFlower().comparisonSize(aString, bString));
}
/**
* 比較雙方牌大小.
*
* @param input1
* 玩家1牌
* @param input2
* 玩家2牌
* @return 大小
*/
private int comparisonSize(String input1, String input2) {
char[] inputChar1 = input1.toCharArray();
char[] inputChar2 = input2.toCharArray();
// 判斷玩家1入參合法性
int a = checkParameter(inputChar1);
if (a != 0) {
return a;
}
// 判斷玩家2入參合法性
int b = checkParameter(inputChar2);
if (b != 0) {
return b;
}
List<String> input1s = setInput(inputChar1); // 將玩家1牌字元轉換為字串集合
List<String> input2s = setInput(inputChar2); // 將玩家2牌字元轉換為字串集合
System.out.println("。。。。。。。。。。。。。。。。。。。。。。");
Map<String, Integer> map1 = charCount(input1s); // 計算玩家1不同牌的個數
Map<String, Integer> map2 = charCount(input2s); // 計算玩家2不同牌的個數
switch (map1.size()) {
// 當玩家1為豹子時
case 1:
switch (map2.size()) {
case 1: // 當雙方都為豹子時
String card1 = null;
for (String key : map1.keySet()) {
card1 = key;
break;
}
String card2 = null;
for (String key : map2.keySet()) {
card2 = key;
break;
}
return compareSingleCard(card1, card2); // 都為豹子時,只需比較單張牌大小即可
case 2: // 如果玩家1為豹子,玩家2為對子則玩家1大
return 1;
case 3: // 如果玩家1為豹子,玩家2無論是順子還是單牌,則玩家1大
return 1;
default:
return -2;
}
// 當玩家1為對子時
case 2:
switch (map2.size()) {
case 1: // 當玩家1為對子,玩家2為豹子時,則玩家2大
return -1;
case 2: // 當雙方都為對子時
return compareSub(map1, map2); // 比較對子的大小
case 3:
// 如果玩家2為順子
if (isShunZi(map2)) {
return -1;
} else { // 否則則為單牌
return 1;
}
default:
return -2;
}
// 當玩家1為順子,或單牌時
case 3:
switch (map2.size()) {
case 1:
return -1;
case 2:
if (isShunZi(map1)) {
return 1;
} else {
return -1;
}
case 3:
if (isShunZi(map1)) {
if (isShunZi(map2)) {
// 雙方都是順子
return compareShunZi(map1, map2); // 比較順子大小
} else {
return 1;
}
} else {
if (isShunZi(map2)) {
return -1;
} else {
// 雙方都是單牌
return compareSingleCard(map1, map2); // 比較每個牌大小
}
}
default:
return -2;
}
default:
return -2;
}
}
private List<String> setInput(char[] inputChar) {
List<String> inputs = new ArrayList<>();
for (Character character : inputChar) {
if (character == '1') {
inputs.add("10");
} else if (character == '0') {
continue;
} else {
inputs.add(character.toString());
}
}
return inputs;
}
/**
* 將牌字元組裝成map.
*
* @param inputs
* 字元集合
* @return Map
*/
private Map<String, Integer> charCount(List<String> inputs) {
Map<String, Integer> map = new HashMap<>();
for (String input : inputs) {
if (map.containsKey(input)) {
map.put(input, map.get(input) + 1);
} else {
map.put(input, 1);
}
}
return map;
}
Character[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K', 'A'};
List<Character> characters = Arrays.asList(chars);
/**
* 檢查入參是否合法.
*
* @param inputChar
* 字元
* @return 數字
*/
private int checkParameter(char[] inputChar) {
int length = inputChar.length;
if (length < 3 || length > 6) {
return -2;
}
if (inputChar[0] == '0') {
return -2;
}
int count = 0;
for (int i = 0; i < length; i++) {
Character character = inputChar[i];
if (!characters.contains(character)) {
return -2;
}
if (i == length - 1) {
if (character == '1') {
return -2;
}
} else {
if (character == '1') {
if (inputChar[i + 1] == '0') {
count++;
} else {
return -2;
}
}
}
if (character == '0' && inputChar[i - 1] != '1') {
return -2;
}
}
if (count + 3 != length) {
return -2;
}
return 0;
}
/**
* 將牌的大小進行排序.
*
* @param map
* 牌
* @return 排序後的數字
*/
private List<Integer> sortCollection(Map<String, Integer> map) {
Set<String> keys = map.keySet();
List<Integer> intCard = new ArrayList<>();
for (String key : keys) {
intCard.add(getIntVlue(key));
}
Collections.sort(intCard, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
return intCard;
}
/**
* 比較雙方都是單牌時的大小.
*
* @param map1
* 玩家1牌
* @param map2
* 玩家2牌
* @return 大小
*/
private int compareSingleCard(Map<String, Integer> map1, Map<String, Integer> map2) {
List<Integer> intCard1 = sortCollection(map1);
int a0 = intCard1.get(0);
int a1 = intCard1.get(1);
int a = intCard1.get(2);
List<Integer> intCard2 = sortCollection(map2);
int b0 = intCard2.get(0);
int b1 = intCard2.get(1);
int b = intCard2.get(2);
if (a > b) {
return 1;
} else if (a < b) {
return -1;
} else {
if (a1 > b1) {
return 1;
} else if (a1 < b1) {
return -1;
} else {
if (a0 > b0) {
return 1;
} else if (a0 < b0) {
return -1;
} else {
return 0;
}
}
}
}
/**
* 比較雙方都為順子時的大小.
*
* @param map1
* 玩家1牌
* @param map2
* 玩家2牌
* @return 大小
*/
private int compareShunZi(Map<String, Integer> map1, Map<String, Integer> map2) {
List<Integer> intCard1 = sortCollection(map1);
int a = intCard1.get(2);
List<Integer> intCard2 = sortCollection(map2);
int b = intCard2.get(2);
if (a > b) {
return 1;
} else if (a < b) {
return -1;
} else {
return 0;
}
}
/**
* 判斷牌是否是順子.
*
* @param map
* 牌
* @return true 或 false
*/
private boolean isShunZi(Map<String, Integer> map) {
List<Integer> intCard = sortCollection(map);
int a = intCard.get(0);
int b = intCard.get(1);
int c = intCard.get(2);
if (a + 1 == b && b + 1 == c) {
return true;
}
return false;
}
/**
* 比較單個牌的大小.
*
* @param card1
* 牌1
* @param card2
* 牌2
* @return 大小
*/
private int compareSingleCard(String card1, String card2) {
int a = getIntVlue(card1);
int b = getIntVlue(card2);
if (a > b) {
return 1;
} else if (a < b) {
return -1;
} else {
return 0;
}
}
/**
* 將牌轉化為數字方便比較大小.
*
* @param card1
* 牌
* @return 數字
*/
private int getIntVlue(String card1) {
int a = 0;
switch (card1) {
case "J":
a = 11;
break;
case "Q":
a = 12;
break;
case "K":
a = 13;
break;
case "A":
a = 14;
break;
default:
try {
a = Integer.valueOf(card1);
} catch (Exception e2) {
return -2;
}
break;
}
return a;
}
/**
* 比較雙方都為對子時的大小.
*
* @param map1
* 玩家1 牌
* @param map2
* 玩家2 牌
* @return 大小
*/
private int compareSub(Map<String, Integer> map1, Map<String, Integer> map2) {
String card1 = null;
String card11 = null;
for (Map.Entry<String, Integer> map : map1.entrySet()) {
int b = map.getValue();
if (b == 1) {
card11 = map.getKey();
}
if (b == 2) {
card1 = map.getKey();
}
}
String card2 = null;
String card22 = null;
for (Map.Entry<String, Integer> map : map2.entrySet()) {
int b = map.getValue();
if (b == 1) {
card22 = map.getKey();
}
if (b == 2) {
card2 = map.getKey();
}
}
int c = compareSingleCard(card1, card2); // 比較對子牌
// 如果對子牌相等,則比較剩下的單牌大小
if (c == 0) {
int d = compareSingleCard(card11, card22);
return d;
} else {
return c;
}
}}
該程式碼由本人所寫,如有bug 望指出。
相關推薦
搜狐2016招聘筆試題(扎金花)及答案
題目描述兩個搜狐的程式設計師加了一個月班,終於放假了,於是他們決定扎金花渡過愉快的假期 。遊戲規則:共52張普通牌,牌面為2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小遞增,各四張; 每人抓三張牌。兩人比較手中三張牌大小,大的人獲勝。對於牌型的規則如下:1.三
名企筆試:網易遊戲2017招聘筆試題(調整隊形)
網易遊戲2017招聘筆試題(調整隊形) 題意: 在幼兒園有n個小朋友排列為一個隊伍,從左到右一個挨著一個編號為(0~n-1)。其中有一些是男生,有一些是女生,男生用’B’表示,女生用’G’表示。小朋
網易遊戲2016校園招聘筆試題(一)
網易線上遊戲是網易公司的一個重要組成部分,在開發實力、產品線和市場佔有率上均是國產網遊的領軍者。正在運營的廣受中國玩家歡迎的遊戲包括《新大話西遊2》、《夢幻西遊2》、《天下3》等等。 小Z一直是網易的粉絲,從網易97年6月成立開始他就一直關注著它的發展,並且玩過幾乎所有的網易遊戲。同時他也是一名數學愛好者,
微策略2011校園招聘筆試題(找出陣列中兩個只出現一次的數字)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
2019年網易遊戲暑期實習生招聘筆試題(2018年4月27日)第一題解答
題目描述:足球比賽的積分排名,一共16支球隊,分為4組,每組4支球隊,小組賽實行單迴圈制,每組一共進行6場比賽,勝者積3分,負者0分,打成平局各得一分,積分相同看淨勝球數,淨勝球多的排名靠前,淨勝球數相同看總進球數,總進球數多的排名靠前,總進球數也相同的球隊,名稱的字母序小的
名企筆試:網易遊戲2017招聘筆試題(趕去公司)
網易遊戲2017招聘筆試題(趕去公司) 題意: 終於到週末啦!小易走在市區的街道上準備找朋友聚會,突然伺服器發來警報,小易需要立即回公司修復這個緊急bug。假設市區是一個無限大的區域,每條街道假設座標是(X,Y),小易當前在(0,0)街道,辦公室在(gx,g
騰訊2016實習筆試題(最長迴文子序列)
問題描述 迴文串:首位相同的字串,如:abba aca 迴文序列:在字串裡面刪除一個或多個字元,剩餘的字元組成迴文串。如:abbceda 刪除"ced",剩餘abba組成迴文序列 最長迴文
2016年騰訊校招筆試題(研發崗)
最近網際網路筆試較頻繁,也跟著師兄一起做了一些公司的筆試題,先將題記錄下來吧,答案慢慢補。希望對自己明年找工作有幫助!首先上騰訊的筆試題,騰訊是我的dream offer啊啊啊啊啊啊啊! 一、不定
2014百度校園招聘筆試題(上海軟體研發工程師)
10月12號中午收到了百度筆試的通知,10月13號下午2:00到4:00在浙大玉泉參加筆試。時間很緊,就匆匆從溫州乘動車來到杭州 筆試的題目: 一.簡答題 1.簡述iso的7層設計 2.如何在多個進行間進行資料共享(至少寫出3種) 3.簡述TCP與UDP的區別 二.演算法題 1.有一個數據A =
2018金山wps暑期招聘伺服器端筆試題(第二批)
本次的金山在我就讀的大學舉行招聘會,題主有幸能參加筆試,在此,感謝金山wps給我這次機會。話不多說,直接給題,題目是憑藉題主的記憶寫出來的,可能與原題略有出入。第一大題:1,寫出檢視繫結埠的命令和引數(linux) 答:使用netstat命令, 例如:ne
15、2016校招騰訊研發崗筆試題(第二題)用Java實現
有下圖的題解,請用 C/C++ 程式碼來列出滿足下圖 0-100 內的所有答案。 分析: a1+a2-9=4 (1) a4-a5*a6=4 (2) a7+a8-a9=4 (3) a1+a4/a7=4 (4)
京東2016招聘筆試題Java程式碼
題目描述 果園裡有一堆蘋果,一共n頭(n大於1小於9)熊來分,第一頭為小東,它把蘋果均分n份後,多出了一個,它扔掉了這一個,拿走了自己的一份蘋果,接著第二頭熊重複這一過程,即先均分n份,扔掉一個然
php相關筆試題-(持續更新)
nta register c中 art 如何判斷 sort ron 問題 ted 1.如果系統做了負載均衡(或者代理),服務端如何準確得獲取用戶端的IP? 答:添加X-Forwarded-For,簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HT
深信服2018.10.13 C++開發秋招筆試題(第一題)
第一題: 記得不太清了,湊合看吧! 輸入: 第一行:T 表示有T個測試用例 以下N行: 輸入的T個測試用例 測試用例: 每個輸入包含四個輸入,a,b,c,n 1<=a,b,c<=9,abc三個值為初始輸入,將它們放到輸出結果中,
金山wps前端工程師筆試題(B卷)
1. 請寫出以下程式碼的輸出結果 function f1() { var n = 99; nAdd=function() { n += 1; } function f2() { console.log(n);
Linux運維必會的實戰程式設計筆試題(19題)
以下Linux運維筆試面試程式設計題,彙總整理自老男孩、馬哥等培訓機構,由運維派根據實戰需求,略有調整: 企業面試題1:(生產實戰案例):監控MySQL主從同步是否異常,如果異常,則傳送簡訊或者郵件給管理員。提示:如果沒主從同步環境,可以用下面文字放到檔案裡讀取來模擬: 階段1:開發一個守護程序指令
分享18道Java基礎面試筆試題(面試實拍)
上圖來自Java技術棧微信群裡的群友分享,看起來比較基礎,但不一定人人都答得上來。圖片比較模糊,小編把題目進行了文字化。1.你最常上的兩個技術站和最常使用的兩個app分別進什麼?主要解決你什麼需求?2.請簡述http協議中get請求和post請求的區別.3.請簡述sessio
2014年騰訊暑期實習筆試題(含分析)
這是第二次來參加騰訊的筆試了,感覺和往年的試題差別不大,考得比較基礎,內容也基本集中在C++,資料結構,作業系統部分,計算機網路部分。騰訊的筆試題選擇題貌似每年都是不定項選擇,熟話說不怕單項,不怕多項,最怕不定項,在不知道怎麼做的情況下要想蒙對很不容易啊,據說蒙對的概率是4
[84題]Linux運維常見筆試題(填空題)
1. 在Linux 系統 中,以檔案方式訪問裝置 。 2. Linux 核心引導時,從檔案/etc/fstab中讀取要載入的檔案系統 。 3. Linux 檔案系統中每個檔案用indoe節點來標識。 4. 全部磁碟塊由四個部分組成,分別為引導塊 、專用塊 、 i 節點表塊 和 資料儲存塊 。 5.
JavaScript筆試題(持續更新)
1. JavaScript中的函式宣告的方式有哪些? 2. JavaScript中的陣列宣告的方式有哪些? 3. 如何遍歷陣列? 4. 常見的算術運算子有哪些? 5. 比較運算子“==”與“===”的區別? 6. JavaScript中如