Welcome to Subscribe On Youtube
2347. Best Poker Hand
Description
You are given an integer array ranks
and a character array suits
. You have 5
cards where the ith
card has a rank of ranks[i]
and a suit of suits[i]
.
The following are the types of poker hands you can make from best to worst:
"Flush"
: Five cards of the same suit."Three of a Kind"
: Three cards of the same rank."Pair"
: Two cards of the same rank."High Card"
: Any single card.
Return a string representing the best type of poker hand you can make with the given cards.
Note that the return values are case-sensitive.
Example 1:
Input: ranks = [13,2,3,1,9], suits = ["a","a","a","a","a"] Output: "Flush" Explanation: The hand with all the cards consists of 5 cards with the same suit, so we have a "Flush".
Example 2:
Input: ranks = [4,4,2,4,4], suits = ["d","a","a","b","c"] Output: "Three of a Kind" Explanation: The hand with the first, second, and fourth card consists of 3 cards with the same rank, so we have a "Three of a Kind". Note that we could also make a "Pair" hand but "Three of a Kind" is a better hand. Also note that other cards could be used to make the "Three of a Kind" hand.
Example 3:
Input: ranks = [10,10,2,12,9], suits = ["a","b","c","a","d"] Output: "Pair" Explanation: The hand with the first and second card consists of 2 cards with the same rank, so we have a "Pair". Note that we cannot make a "Flush" or a "Three of a Kind".
Constraints:
ranks.length == suits.length == 5
1 <= ranks[i] <= 13
'a' <= suits[i] <= 'd'
- No two cards have the same rank and suit.
Solutions
-
class Solution { public String bestHand(int[] ranks, char[] suits) { boolean flush = true; for (int i = 1; i < 5 && flush; ++i) { flush = suits[i] == suits[i - 1]; } if (flush) { return "Flush"; } int[] cnt = new int[14]; boolean pair = false; for (int x : ranks) { if (++cnt[x] == 3) { return "Three of a Kind"; } pair = pair || cnt[x] == 2; } return pair ? "Pair" : "High Card"; } }
-
class Solution { public: string bestHand(vector<int>& ranks, vector<char>& suits) { bool flush = true; for (int i = 1; i < 5 && flush; ++i) { flush = suits[i] == suits[i - 1]; } if (flush) { return "Flush"; } int cnt[14]{}; bool pair = false; for (int& x : ranks) { if (++cnt[x] == 3) { return "Three of a Kind"; } pair |= cnt[x] == 2; } return pair ? "Pair" : "High Card"; } };
-
class Solution: def bestHand(self, ranks: List[int], suits: List[str]) -> str: # if len(set(suits)) == 1: if all(a == b for a, b in pairwise(suits)): return 'Flush' cnt = Counter(ranks) if any(v >= 3 for v in cnt.values()): return 'Three of a Kind' if any(v == 2 for v in cnt.values()): return 'Pair' return 'High Card'
-
func bestHand(ranks []int, suits []byte) string { flush := true for i := 1; i < 5 && flush; i++ { flush = suits[i] == suits[i-1] } if flush { return "Flush" } cnt := [14]int{} pair := false for _, x := range ranks { cnt[x]++ if cnt[x] == 3 { return "Three of a Kind" } pair = pair || cnt[x] == 2 } if pair { return "Pair" } return "High Card" }
-
function bestHand(ranks: number[], suits: string[]): string { if (suits.every(v => v === suits[0])) { return 'Flush'; } const count = new Array(14).fill(0); let isPair = false; for (const v of ranks) { if (++count[v] === 3) { return 'Three of a Kind'; } isPair = isPair || count[v] === 2; } if (isPair) { return 'Pair'; } return 'High Card'; }
-
impl Solution { pub fn best_hand(ranks: Vec<i32>, suits: Vec<char>) -> String { if suits.iter().all(|v| *v == suits[0]) { return "Flush".to_string(); } let mut count = [0; 14]; let mut is_pair = false; for &v in ranks.iter() { let i = v as usize; count[i] += 1; if count[i] == 3 { return "Three of a Kind".to_string(); } is_pair = is_pair || count[i] == 2; } (if is_pair { "Pair" } else { "High Card" }).to_string() } }