同花顺

309 阅读1分钟

需求

判断 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;
}