一道简单的洗牌题

这个我面试时的一题:

一副牌有54张去掉大小王,剩下的52张牌按花色平均分成两份,每份26张,假如洗牌时每份一张的交叉。如:

初始:
A红 2红 3红 4红 5红 6红 7红 8红 9红 10红 J红 Q红 K红
A黑 2黑 3黑 4黑 5黑 6黑 7黑 8黑 9黑 10黑 J黑 Q黑 K黑
A梅 2梅 3梅 4梅 5梅 6梅 7梅 8梅 9梅 10梅 J梅 Q梅 K梅
A方 2方 3方 4方 5方 6方 7方 8方 9方 10方 J方 Q方 K方
洗一轮后:
A红  A梅  2  2梅  3红  3梅  4红  4梅  5红  5梅  6红  6梅  7红 
7梅  8红  8梅  9红  9梅  10红  10梅  J红  J梅  Q红  Q梅  K红  K梅
A黑  A方  2黑  2  3黑  3方  4黑  4方  5黑  5方  6黑  6方  7黑 
7方  8黑  8方  9黑  9方  10黑  10方  J黑  J方  Q黑  Q方  K黑  K方

问:

(1)2红与2方在洗一轮后所在位置为3和30,第三轮时它们分别在什么位置。

(2)当洗N轮后牌会回到初始状态,请问N是都少。

答:(1)分别在9和15。

(2)8

代码如下:

public class test {
public static String[] insertSort(String[] args) {
for(int i=0;i<args.length/2;i++){
for (int j = 26+i; j > 2*i+1; j--) {
String temp = args[j];
args[j] = args[j-1];
args[j-1] = temp;
}
}
return args;
     }
public static void main(String[] args) {
String[] argStrings={
 "A红","2红","3红","4红","5红","6红","7红","8红","9红","10红","J红","Q红","K红",
 "A黑","2黑","3黑","4黑","5黑","6黑","7黑","8黑","9黑","10黑","J黑","Q黑","K黑",
 "A梅","2梅","3梅","4梅","5梅","6梅","7梅","8梅","9梅","10梅","J梅","Q梅","K梅",
 "A方","2方","3方","4方","5方","6方","7方","8方","9方","10方 ","J方 ","Q方","K方"
};
for (int i = 0; i <1; i++) {
String[] string1 = insertSort(argStrings);
String[] string =null;
System.out.print("请输入洗牌的轮数:");
int num;
num = new Scanner(System.in).nextInt();
if(num<=0){
System.out.println("输入的次数不对,请从新输入");
num=new Scanner(System.in).nextInt();
}
if(num==1){
string=string1;
}else {
for (int j = 0; j < num-1; j++) {
string = insertSort(string1);
}
}
//按每行13张牌进行输出
for (int j = 0; j < string.length; j++) {
if (j==13) {
System.out.println();
System.out.print(string[j]);
} else if(j==26){
System.out.println();
System.out.print(string[j]);
}else if(j==39){
System.out.println();
System.out.print(string[j]);
}else {
System.out.print(string[j]);
}
}
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章