这个我面试时的一题:
一副牌有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]);
}
}
}
}
}