蚂蚁金服测试开发一面笔试题-编写代码,提供扑克牌洗牌发牌能力,输出每个参与玩牌人获得的牌面数组

先上题
/*
一、编码题(实现语言不限)
1、编写代码,提供扑克牌洗牌发牌能力,输出每个参与玩牌人获得的牌面数组:
牌的属性需要包括花色+数字,每副牌含有鬼牌2张
2、扑克牌张数作为可变入参,参数规则如下:
(1)可能有1~N副扑克牌,N必为整数
(2)N作为可变入参,取值范围为[1,4]
(3)需要做数据合法保障,例如:牌堆中同一花色数字出现的重复次数不可大于N、不可出现超过2N张以上鬼牌等
3、参与玩牌人数M作为可变参数,参数校验规则:
(1)2≤M≤7
4、所有参与玩牌者获得牌数应该相等,余牌进入废牌池,废牌池同样需要输出
(1)总牌数 整除 参与玩牌人数的余数 作为废牌
(2)废牌数可设置,作为动态配置参数,设置规则为M的系数k,即最终废牌总数为:k
M + N%M
5、尽量做到性能最优
*/

public static void puke(int n,int m,int k){
        if (m<2||m>7){
            System.out.println("人数在2-7人");
            return;
        }
        if (n<1||n>4){
            System.out.println("扑克只能1-4副");
            return;
        }
        int num = 54;
        int max = n*num;
        int feipai = k*m+max%m;
        if (feipai>=max){
            System.out.println("废牌不能大于总数");
            return;
        }
        List<Integer> all = new ArrayList<>();
        while(all.size()<max-feipai){
            Random r = new Random();
            int result = r.nextInt(max) + 1;
            if (!all.contains(result)){
                all.add(result);
            }
        }
        List<Integer> feipaiList = new ArrayList<>();
        for(int i=1;i<=max;i++){
            if (!all.contains(i)){
                feipaiList.add(i);
            }
        }
        List<String> finalpai = geshihua(all);
        for (int i=0;i<m;i++){
            int onesize = finalpai.size()/m;
            System.out.println("第"+i+"个人:"+finalpai.subList(i*onesize, (i+1) * onesize));
        }
        List<String> finalfeipai = geshihua(feipaiList);
        System.out.println("废牌列表:"+finalfeipai);
    }
    public static List<String> geshihua(List<Integer> a){
        List<String> ret = new ArrayList<>();
        for (int one: a){
            if (one%54==0){
                ret.add("大王");
                continue;
            }
            if (one%53==0){
                ret.add("小王");
                continue;
            }
            if (one%4==0){
                ret.add((one%54)/4+"-花色4");
            }else{
                ret.add((one%54)/4+1+"-花色"+one%4);
            }
        }
        return ret;
    }
        public static void main(String[] args) {
        puke(2,5,20);

    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值