華為機試題麻將合牌計算


如題:機試第一輪就碰到它,90分鍾不夠直接掛了。在此記錄以供大家參考

題目:麻將有1-9的數字,每個數字只能出現4次。相同的兩個數字為對子,例如22;連續的3個數字為順子,例如123;相同的三個數字為刻子,例如333

糊牌規則:當玩家手中的牌數量為:2、5、8、11、14張時,且是對子、順子、刻子的組合則 達到糊牌標准。希望下次機考把輸出說明說清楚,這點很坑。

import java.util.*;

/**
 * @Auther: lanhaifeng
 * @Date: 2020/5/20 0020 15:07
 * @Description:
 * @statement: 題目:麻將有1-9的數字,每個數字只能出現4次。相同的兩個數字為對子,例如22;連續的3個數字為順子,例如123;相同的三個數字為刻子,例如333
 * 糊牌規則:當玩家手中的牌數量為:2、5、8、11、14張時,且是對子、順子、刻子的組合則 達到糊牌標准。
 */
public class Main {
    private int max_num=4;//同一張牌最多出現次數
    List<Pook> list=new ArrayList<Pook>();//存放麻將的記錄,因為麻將只有1-9

    public static void main(String[] args) {
        Main main=new Main();
        Scanner scanner=new Scanner(System.in);

        System.out.println("請出入當前的牌小於0大於9將被自動過濾,例子:12355");
         main.look(scanner);



    }

    /**
     * 拆分數組
     * @param scanner
     */
    public void look(Scanner scanner){
        String num=scanner.next();
        String[] split = num.split("");//拆分輸入的數字
        List<Integer> array=new ArrayList<Integer>();
        //把輸入數字裝入驗證的數組
        int temp;
        for (int i = 0; i < split.length; i++) {
            temp=Integer.parseInt(split[i]);
            //自動踢出輸入小於0和大於9的牌
            if(temp> 0 && temp < 10){
                array.add(temp);
            }
        }
        //驗證輸入的數字是否符合糊牌的規則,1-9范圍這里沒驗證
       change(array);
    }

    /**
     * 校驗
     * @param array
     */
    public void change(List<Integer> array){
        Pook pook;
        for (int i = 0; i < array.size(); i++) {
            //下標判斷>3
            if(i<array.size()-2){
                int[] arrays={array.get(i),array.get(i+1),array.get(i+2)};
                Arrays.sort(arrays);//進行一個升序排序,后面既使順子順序錯位也可以識別
                //驗證刻字
                if(arrays[0]==arrays[1] && arrays[0]==arrays[2]){
                    addPook(new Pook(array.get(i),3,3));
                    System.out.print(array.get(i)+""+array.get(i+1)+""+array.get(i+2)+"刻子 ");
                    i=i+2;
                    continue;
                }
                //驗證順子
                if(arrays[2]-arrays[1]==1 && arrays[1]-arrays[0]==1 ){
                    //順子的糊牌因子每個成員分配1,一個順子是3
                    addPook(new Pook(array.get(i),1,1));
                    addPook(new Pook(array.get(i+1),1,1));
                    addPook(new Pook(array.get(i+2),1,1));
                    System.out.print(array.get(i)+""+array.get(i+1)+""+array.get(i+2)+"順子 ");
                    i=i+2;
                    continue;
                }
            }
            //下標判斷>2
            if(i<array.size()-1){
                //驗證對子
                if(array.get(i)==array.get(i+1)){
                     addPook(new Pook(array.get(i), 2, 2));
                    System.out.print(array.get(i)+""+array.get(i+1)+"對子 ");
                    i++;
                    continue;
                }
            }
            addPook(new Pook(array.get(i),1,0));
            System.out.print(array.get(i));
        }
        if(this.list.size()>14){
            System.out.print("牌數超過14張 ,no\n");
            return;
        }
        //驗證牌是否超過次數4
        int size=0;//糊牌因子,如果有數字糊牌因子等於0也不能贏(159 88 333的例子)
        for (Pook p:this.list) {
            if(p.szie==0){
                System.out.print(" ,no\n");
                return;
            }
            size=size+p.szie;
            if(p.count> max_num){
                System.out.print(p.number+"出現次數="+p.count+">"+max_num+", no\n");
                return;
            }
        }
        //驗證糊牌因子
        System.out.print(" 糊牌因子="+size);
        switch (size) {
            case 2:
                print(true);
                break;
            case 5:
                print(true);
                break;
            case 8:
                print(true);
                break;
            case 11:
                print(true);
                break;
            case 14:
                print(true);
                break;
            default:
                print(false);
                break;
        }
    }

    //添加牌
    public void addPook(Pook pook){
        if(this.list.size()==0){
            this.list=new ArrayList<Pook>(9);
            this.list.add(pook);
            return;
        }else {
            for (Pook p:this.list) {
                if(p.number==pook.number){
                    p.count=p.count+pook.count;
                    p.szie=p.szie+pook.szie;
                    return;
                }
            }
            this.list.add(pook);
        }

    }


    /**
     * 打印結果
     * @param b
     */
    public void print(boolean b){
        System.out.println(b==true?",yes\n":",no\n");
    }


    /**
     * 麻將類
     */
    class Pook{
        int number;//數字
        int count;//次數
        int szie;//糊牌因子

        public Pook(int number, int count, int szie) {
            this.number = number;
            this.count = count;
            this.szie = szie;
        }

        public int getNumber() {
            return number;
        }

        public void setNumber(int number) {
            this.number = number;
        }

        public int getCount() {
            return count;
        }

        public void setCount(int count) {
            this.count = count;
        }

        public int getSzie() {
            return szie;
        }

        public void setSzie(int szie) {
            this.szie = szie;
        }
    }


    public List<Pook> getList() {
        return list;
    }

    public void setList(List<Pook> list) {
        this.list = list;
    }
}

我90分鍾是沒做出來,調試了基本無BUG,支持 7 對,亂序順子的驗證。希望大家華為機試好運!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM