問題描述 小弱T在閑暇的時候會和室友打撲克,輸的人就要負責洗牌。雖然小弱T不怎麼會洗牌,但是他卻總是輸。 漸漸地小弱T發現了一個規律:只要自己洗牌,自己就一定會輸。所以小弱T認為自己洗牌不夠均勻,就獨創了一種小弱洗牌法。 小弱洗牌法是這樣做的:先用傳統洗牌法將52張撲克牌(1到K各四張,除去大小王) ...
問題描述 小弱T在閑暇的時候會和室友打撲克,輸的人就要負責洗牌。雖然小弱T不怎麼會洗牌,但是他卻總是輸。
漸漸地小弱T發現了一個規律:只要自己洗牌,自己就一定會輸。所以小弱T認為自己洗牌不夠均勻,就獨創了一種小弱洗牌法。
小弱洗牌法是這樣做的:先用傳統洗牌法將52張撲克牌(1到K各四張,除去大小王)打亂,放成一堆,然後每次從牌堆頂層拿一張牌。如果這張牌的大小是P(1到K的大小分別為1到13),那麼就把這張牌插入到當前手中第P張牌的後面。如果當前手中不足P張牌,那麼就把這張牌放在最後。
現在給你一對已經被打亂的牌,請你用小弱洗牌法進行洗牌,然後輸出最後生成的序列。
註意:小弱可能在第一次洗牌時弄丟了某些牌,這時請你輸出一個-1來提醒他牌的數目不夠。 輸入格式 測試數據的輸入含N個用空格隔開的字元串表示牌堆從頂至底的每張撲克(1到K中的某個)。可能有多行。 輸出格式 如果N為52,輸出用小弱洗牌法洗牌後的序列,每個字元串用空格隔開。
否則請輸出一個-1. 樣例輸入 4 6 K Q 5 1 Q 9 7 9 K 3 J 1 2 3 5
2
3 5 7 Q 7 10 8 4 9 7 8 9 4
10 6 2 8 2 10 10 Q 5 K J 1
J 8 3 K 4 1 6 J 6 樣例輸出 4 1 1 1 3 4 6 6 2 2 2 5 J 3 8 4 4 6 K J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K 數據規模和約定 保證每個字元串都為1 2 3 4 5 6 7 8 9 10 J Q K中的一個。
package 藍橋杯java演算法訓練; import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class _4洗牌 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); StringBuffer strBuff = new StringBuffer(); while (sc.hasNext()) { String s = sc.next(); //10代表換行鍵 if(s.equals("10")){ strBuff.append("10 "); }else{ //10換行,13回車,32空格 char p = s.charAt(0); if(!(p==10||p==13||p==32)){ strBuff.append(((char)p)+" "); } } } sc.close(); String str = strBuff.toString(); String[] arr = str.split(" "); if (str.length() < 52) { System.out.println("-1"); } else { List<String> list = new LinkedList<String>(); for (int i = 0; i < arr.length; i++) { int index = 0; if (arr[i].equals("J")) { index = 11; } else if (arr[i].equals("Q")) { index = 12; } else if (arr[i].equals("K")) { index = 13; } else { index = Integer.valueOf(arr[i]); } if (list.size() <= index) { list.add(arr[i]); } else { list.add(index, arr[i]); } } for (int i = 0; i < list.size(); i++) { if (i == list.size() - 1) { System.out.print(list.get(i)); } else { System.out.print(list.get(i) + " "); } } } } }