先上题
/*
一、编码题(实现语言不限)
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,即最终废牌总数为:kM + 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);
}