藍橋杯java試題《洗牌》,藍橋java《洗牌》
問題描述 小弱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) + " ");
}
}
}
}
}