1. 程式人生 > >搜狐2016招聘筆試題(扎金花)及答案

搜狐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中如