昨天去一朋友所在的公司 唱吧—你的手机KTV (小小做一下宣传:目前app store排名很靠前的一款软件)面试了一把,结果XX
其中一个洗扑克牌的程序,昨天在草稿纸上写的,面试官说描述不清晰,今天抽空在电脑上实现了一下,为这次面试画上个句号。
package com.bankht.test.xipai;
import java.util.Random;
import org.junit.Test;
/**
* @author: 特种兵—AK47
* @创建时间:2012-10-24 上午09:44:39
*
* @类说明 :洗牌算法
*/
public class XipaiTest {
private String[] singleCards = new String[] { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
private String[] allCards = new String[54];
private String temp = null;// 定义临时变量,用以交换数组中两个值的位置
@Test
public void testXipai() {
String[] cards = initCard();
for (int s = 0; s < 1000; s++) {
/*
* 从[0,53]之间随机选取两个数字cardNum1,cardNum2,
* 交换对应的数组值位置(cards[cardNum1]<——>cards [cardNum2])
* 该步骤循环1000次
*/
int cardNum1 = new Random().nextInt(54);
int cardNum2 = new Random().nextInt(54);
temp = cards[cardNum1];
cards[cardNum1] = cards[cardNum2];
cards[cardNum2] = temp;
}
testCardMessage(cards);// 测试扑克牌当前排序状态
}
/**
* 初始化扑克牌
*
* @return 扑克牌数组
*/
private String[] initCard() {
for (int i = 0; i < 13; i++) {
String[] initCard = addMessage2Card(singleCards[i]);
for (int j = 0; j < 4; j++) {
allCards[i * 4 + j] = initCard[j];
}
}
allCards[52] = "小王";
allCards[53] = "大王";
return allCards;
}
/**
* 针对2,3,4...Q,K,A 都有公共信息【红桃、方片、梅花、黑桃】,在初始化时进行添加
*
* @param card
* @return
*/
private String[] addMessage2Card(String card) {
return new String[] { "红桃" + card, "方片" + card, "梅花" + card, "黑桃" + card };
}
/**
* 测试扑克牌当前排序状态
*
* @param allCards
*/
private void testCardMessage(String[] allCards) {
for (int m = 0; m < allCards.length; m++) {
System.out.print(allCards[m] + ",");
if ((m + 1) % 4 == 0) {
System.out.println();
}
}
}
}
运行一下:
方片K,黑桃8,梅花2,红桃2,
梅花5,梅花8,红桃K,黑桃9,
红桃4,方片9,梅花J,方片8,
梅花Q,梅花4,黑桃Q,红桃10,
黑桃7,方片5,红桃3,大王,
红桃6,黑桃J,方片2,方片A,
黑桃2,黑桃A,梅花A,方片3,
红桃7,黑桃10,方片6,梅花10,
方片Q,小王,梅花3,红桃8,
黑桃6,黑桃K,黑桃3,红桃J,
红桃A,黑桃5,红桃5,梅花6,
方片J,方片4,红桃Q,黑桃4,
红桃9,梅花7,方片7,梅花K,
方片10,梅花9,
其实只是个把两个随机数对应扑克牌位置去相互交换的思想,至于将一副扑克牌还原整齐就用到常用的排序(选择排序、希尔、冒泡等)了
最后:与这家公司已经失之交臂了,不过还是真心的祝愿这款软件能够保持目前的迅猛态势,快速发展。不管怎样,万分感谢晓凯的推荐,谢谢田然总监的建议。