zoukankan      html  css  js  c++  java
  • 华为机试题麻将合牌计算

    如题:机试第一轮就碰到它,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 对,乱序顺子的验证。希望大家华为机试好运!

  • 相关阅读:
    AutoFac (控制反转IOC 与依赖注入DI)
    【干货】利用MVC5+EF6搭建博客系统(一)EF Code frist、实现泛型数据仓储以及业务逻辑
    Log4.Net 在Winfrom、MVC、ashx程序里的使用,ashx程序里使用异步
    触发器
    游标的使用
    sql数据库快照与恢复 规则绑定
    磁盘恢复
    修改sql数据库名称
    MVC学习笔记
    NuGet包和功能
  • 原文地址:https://www.cnblogs.com/zeussbook/p/12926327.html
Copyright © 2011-2022 走看看