将一副扑克牌按花色排序(花色顺序是黑桃、红桃、梅花和方片),限制条件是所有牌都是背面朝上排成一列,而你一次只能翻看两张牌或者交换两张牌(保持背面朝上)。
不妨设黑桃=1,红桃=2,梅花=3,方片=4。
初始一个原始数组
for(int i = 0; i < 52; i ++) {
a[i] = i / 13 + 1;
System.out.print(a[i] + " ");
}
System.out.println();
打印结果:1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4
洗牌
List<Integer> aIndex = new ArrayList<Integer>();
for(int i = 0; i < 52; i++) {
aIndex.add(i);
}
Collections.shuffle(aIndex);
for(int i = 0; i < 52; i ++) {
buffer[i] = a[aIndex.get(i)];
}
for(int i = 0; i < 52; i ++) {
a[i] = buffer[i];
System.out.print(a[i] + " ");
}
System.out.println();
打印结果:1 4 3 4 4 3 2 4 2 3 1 3 3 4 3 4 1 2 1 2 1 1 4 2 4 1 2 2 3 1 4 4 1 1 2 2 2 2 3 1 1 3 4 4 3 2 4 3 3 2 3 1
我们的任务是将这组数据按照题目要求还原,思路的主体是每次翻看两张牌,寻找我们的目标花色,找到后再判断是否需要交换位置。目标花色顺序为黑桃、红桃、梅花和方片。
搜索顺序是从头到尾,锁定card1为第i张牌,一起翻看其后面的card2第i+1张牌,若两张牌同为目标花色,则card1为跳转至第i+2张牌;若只有card1是目标花色,则card1转至第i+1张牌;若两张牌都不是目标花色,则card2依次后移一个单位知道找到目标花色为止,然后两张牌进行置换,card1转至i+1继续搜索。当一种花色寻找完毕时,需要更换目标花色。具体代码如下:
public class PokerSort {
public void sort(int[] a) {
int card1 = 0, card2 = 1;
int Num = 1;
while(Num <= 4) {
if(a[card1] == Num) {
if(a[card2] == Num) {
card1 = card1 + 2;
card2 = card1 + 1;
} else {
card1 ++;
card2 = card1 + 1;
}
} else {
if(a[card2] == Num) {
exch(a, card1, card2);
card1 ++;
card2 = card1 + 1;
} else {
card2 ++;
}
}
if(card2 >= 52) {
Num ++;
card2 = card1 + 1;
}
}
}
public void exch(int[] a, int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
运行及结果
PokerSort poker = new PokerSort();
poker.sort(a);
for(int i = 0; i < 52; i ++) {
System.out.print(a[i] + " ");
}
1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4