华为机试题麻将合牌计算

如题:机试第一轮就碰到它,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
");
            return;
        }
        //验证牌是否超过次数4
        int size=0;//糊牌因子,如果有数字糊牌因子等于0也不能赢(159 88 333的例子)
        for (Pook p:this.list) {
            if(p.szie==0){
                System.out.print(" ,no
");
                return;
            }
            size=size+p.szie;
            if(p.count> max_num){
                System.out.print(p.number+"出现次数="+p.count+">"+max_num+", no
");
                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
":",no
");
    }


    /**
     * 麻将类
     */
    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 对,乱序顺子的验证。希望大家华为机试好运!

原文地址:https://www.cnblogs.com/zeussbook/p/12926327.html