算法第三週作業01

題目描述

撲克牌遊戲大家應該都比較熟悉了,一副牌由54張組成,含3~A,2各4張,小王1張,大王1張。牌面從小到大用如下字符和字符串表示(其中,小寫joker表示小王,大寫JOKER表示大王):) 
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 
輸入兩手牌,兩手牌之間用“-”連接,每手牌的每張牌以空格分隔,“-”兩邊沒有空格,如:4 4 4 4-joker JOKER
請比較兩手牌大小,輸出較大的牌,如果不存在比較關係則輸出ERROR

基本規則:
(1)輸入每手牌可能是個子,對子,順子(連續5張),三個,炸彈(四個)和對王中的一種,不存在其他情況,由輸入保證兩手牌都是合法的,順子已經從小到大排列;
(2)除了炸彈和對王可以和所有牌比較之外,其他類型的牌只能跟相同類型的存在比較關係(如,對子跟對子比較,三個跟三個比較),不考慮拆牌情況(如:將對子拆分成個子)
(3)大小規則跟大家平時瞭解的常見規則相同,個子,對子,三個比較牌面大小;順子比較最小牌大小;炸彈大於前面所有的牌,炸彈之間比較牌面大小;對王是最大的牌;
(4)輸入的兩手牌不會出現相等的情況。

答案提示:
(1)除了炸彈和對王之外,其他必須同類型比較。
(2)輸入已經保證合法性,不用檢查輸入是否是合法的牌。
(3)輸入的順子已經經過從小到大排序,因此不用再排序了.

輸入描述:
輸入兩手牌,兩手牌之間用“-”連接,每手牌的每張牌以空格分隔,“-”兩邊沒有空格,如4 4 4 4-joker JOKER。


輸出描述:
輸出兩手牌中較大的那手,不含連接符,撲克牌順序不變,仍以空格隔開;如果不存在比較關係則輸出ERROR。

輸入例子:
4 4 4 4-joker JOKER

輸出例子:
joker JOKER

解決方案:

0、將紙牌中的10、J、Q、K、A、2進行轉換,方便之後的比較

1、判斷有誤王炸,若有則最大

2、判斷兩副牌是否同一類型(判斷紙牌長度),如果同一類型,則從最小位開始比較

3、最後判斷一下有誤炸彈的情況

代碼和講解

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String line = sc.nextLine();
		String[] split = line.split("-");
		// 替換字符,方便比較大小其中大小關係: z>a>Z>A>9>0
		String left = split[0].replaceAll("10", "a").replaceAll("J", "b").replaceAll("Q", "c").replaceAll("K", "d").replaceAll("A", "e").replaceAll("2", "f");
		String righ = split[1].replaceAll("10", "a").replaceAll("J", "b").replaceAll("Q", "c").replaceAll("K", "d").replaceAll("A", "e").replaceAll("2", "f");
		String result = null;
		// 如果有JOKER,則她最大
		if(split[0].length() == 11 || split[1].length() == 11){
			result = "joker JOKER";
		} else if(left.length() == righ.length()){
			// 如果兩副牌一樣多,則用從最小位開始比較
			if(left.compareTo(righ) >= 0){
				result = split[0];
			} else {
				result = split[1];
			}
		} else if(left.length() == 7){
			// 如果存在炸彈
			result = split[0];
		} else if(righ.length() == 7){
			// 如果存在炸彈
			result = split[1];
		} else {
			// 否則無法比較
			result = "ERROR";
		}
		// 輸出結果
		System.out.println(result);
	}
}



發佈了40 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章