编程:扑克牌0-10的牌,每个数字4张,加上两张‘王’的牌,抽出五张牌判断5张是为顺子(‘王’做任意牌)

这是一个经典的问题。为了判断5张牌是否可以组成一个顺子,我们需要考虑以下几个因素:

  1. “王” 可以看作是任何数值的牌。
  2. 除 “王” 之外的牌不能重复。
  3. 考虑到 “王” 的任意性,我们需要找出除 “王” 之外的其他牌中的最大和最小值。如果这两者之差小于5,那么5张牌可以组成一个顺子。

以下是该问题的实现:

function isStraight(cards) {
    // 首先,过滤掉王,并找出最大值和最小值
    let min = 11;  // 我们的牌只有0-10,所以初始化为11
    let max = -1; // 我们的牌只有0-10,所以初始化为-1
    let jokerCount = 0;  // 记录王的数量
    let set = new Set();  // 用于记录非王的牌,以判断是否有重复

    for (let card of cards) {
        if (card === '王') {
            jokerCount++;
        } else {
            min = Math.min(min, card);
            max = Math.max(max, card);
            if (set.has(card)) {
                // 如果有重复的牌,直接返回false
                return false;
            }
            set.add(card);
        }
    }

    // 当最大值和最小值的差值小于5时,考虑到王的任意性,牌可以组成一个顺子
    return max - min < 5;
}

// 测试
console.log(isStraight([0, 1, '王', 3, 4]));  // true, 王可以被看作2
console.log(isStraight([0, 10, '王', 3, 4]));  // false
console.log(isStraight(['王', '王', 1, 3, 4]));  // true, 两张王可以被看作0和2

注意,我们使用了一个 Set 数据结构来确保没有重复的牌。而 “王” 可以代替任何需要的牌,所以我们只需要确保最大值和最小值之间的差小于5。

你可能感兴趣的:(字节面试题,javascript,前端)