需求
判断 n 张牌中是否有同花顺
同花顺:连续 && 花色一致
输入:
arr = [
{ number: 1, suit: 'a' },
{ number: 1, suit: 'b' },
{ number: 2, suit: 'a' },
{ number: 4, suit: 'c' },
{ number: 7, suit: 'a' },
{ number: 7, suit: 'c' },
{ number: 6, suit: 'c' },
{ number: 5, suit: 'c' },
{ number: 8, suit: 'c' },
{ number: 8, suit: 'a' },
{ number: 9, suit: 'c' },
];
输出: True
分析
关键信息提取:连续、五张、同色
不可忽略点:数字重复
思路
1、先按 number 排序
2、再按 suit 分类
3、对分类结果判断是否有连续 5 张
Show Code
// main
const _main = (cards) => {
cards.sort((a, b) => a.number - b.number);
for (let i = 0; i < cards.length; i++) {
if (insertCard(cards[i])) {
return true;
}
}
return false;
};
// test
console.log(_main(arr)); // true
// 插入一张排序好的卡片,如果构成同花返回 true
const insertCard = (() => {
const suitMap = {};
return (card) => {
if (!suitMap[card.suit]) {
suitMap[card.suit] = [];
}
const queue = suitMap[card.suit];
queue.push(card.number);
return queue.length === 5 && isStraight(queue)
};
})();
const isStraight = (arr) => {
let _f = arr[0];
let _i = 1;
while(_i < arr.length) {
_f++;
if(_f !== arr[_i]) {
return false;
}
_i++
}
return true;
}