昨天去一朋友所在的公司 唱吧—你的手機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;// 定義臨時變數,用以交換數組中兩個值的位置@Testpublic 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,
其實只是個把兩個隨機數對應撲克牌位置去相互交換的思想,至於將一副撲克牌還原整齊就用到常用的排序(選擇排序、希爾、冒泡等)了
最後:與這家公司已經失之交臂了,不過還是真心的祝願這款軟體能夠保持目前的迅猛態勢,快速發展。不管怎樣,萬分感謝曉凱的推薦,謝謝田然總監的建議。