最长的顺子 --- 华为od刷题
参考题库
华为OD机试备考攻略 以及题库目录分值说明 考点说明
题目描述
斗地主起源于湖北十堰房县,据说是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的,如今已风靡整个中国,并流行于互联网上。
牌型:单顺,又称顺子,最少5张牌,最多12张牌(3…A)不能有2,也不能有大小王,不计花色。
例如: 3-4-5-6-7-8,7-8-9-10-J-Q,3-4-5-6-7-8-9-10-J-Q-K-A
可用的牌 3<4<5<6<7<8<9<10<J<Q<K<A<2<B(小王)<C(大王),每种牌除大小王外有四种花色
(共有13×4+2张牌)
输入:
- 手上有的牌
- 已经出过的牌(包括对手出的和自己出的牌)
输出:
- 对手可能构成的最长的顺子(如果有相同长度的顺子,输出牌面最大的那一个),
- 如果无法构成顺子,则输出 NO-CHAIN。
输入描述
输入的第一行为当前手中的牌
输入的第二行为已经出过的牌
输出描述
最长的顺子
用例
输入 | 3-3-3-3-4-4-5-5-6-7-8-9-10-J-Q-K-A 4-5-6-7-8-8-8 |
输出 | 9-10-J-Q-K-A |
说明 | 无 |
输入 | 3-3-3-3-8-8-8-8 K-K-K-K |
输出 | NO-CHAIN |
说明 | 剩余的牌无法构成顺子 |
C++
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// 将牌面映射为数字,方便处理
string mapToNumber(string pai) {
if (pai == "J") return "11";
if (pai == "11") return "J";
if (pai == "Q") return "12";
if (pai == "12") return "Q";
if (pai == "K") return "13";
if (pai == "13") return "K";
if (pai == "A") return "14";
if (pai == "14") return "A";
return pai;
}
string getLongestChain(vector<string> myCards, vector<string> usedCards) {
// 统计3~A的每张牌的数量,对应数组的索引3~14
int cardCount[] = {0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0};
// 从cardCount中去除myCards,剩下的就是对手的牌及数量
for (string card : myCards) {
int idx = stoi(mapToNumber(card));
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
华为OD机试刷题 文章被收录于专栏
华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。