华为OD机考——斗地主之找顺子

题目描述

在斗地主只扑克牌游戏中,扑克牌由小到大的顺序为:3.4,5.6,7.8,9,10.J,Q.K.A.2,玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。

其中顺子的出牌规则为:由至少5张由小到大连续递增的 扑克牌只 组成,且不能包含2。

例如:(3.4,5,6,7}、(3.4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;而{J,Q,K,A,2}、(2,3,4,5,6}、(3,4,5,6}、(3,4,5.6,8)等都不是顺子给定一个包含 13 张牌的数组,如果有满足出牌规则的顺子,请输出顺子。

如果存在多个顺子,请每行输出一个顺子,且需要按顺子的第一张牌的大小(必须从小到大)依次输出。

如果没有满足出牌规则的顺子,请输出NO。

输入描述

13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王:2 9 J 2 3 4 K A 7 9 A 5 6不需要考虑输入为异常字符的情况

输出描述

组成的顺子,每张扑克牌数字用空格隔开:3 4 5 6 7

示例1

输入

2 9 J 2 3 4 K A 7 9 A 5 6

输出

3 4 5 6 7

说明

13张牌中,可以组成的顺子只有1组:3 4 5 6 7.

示例2

输入

2 9 J 10 3 4 K A 7 Q A 5 6

输出

3 4 5 6 79 10 J Q K A

说明

13张牌中,可以组成2组顺子,从小到大分别为:3 4 5 6 7和9 10 J Q K A

示例3

输入

2 9 9 9 3 4 K A 10 Q A 5 6

输出

NO

说明

13张牌中,无法组成顺子。

我的解法

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let bucket = new Array(13).fill(0);
let sortedCards = [];
rl.on('line', (line) => {
    // 初始化牌堆桶
    initBucketAndCards(line);

    const isStraight = checkStraight();
    if (isStraight) {
        const sequences = findSequences();
        sequences.forEach(seq => console.log(seq.join(' ')));
    } else {
        console.log('NO');
    }
    rl.close();
});

function initBucketAndCards(line) {
    const cards = line.split(' ').map(card => {
        if (card === 'J') return 11;
        if (card === 'Q') return 12;
        if (card === 'K') return 13;
        if (card === 'A') return 14;
        return parseInt(card);
    }).filter(card => card >= 3 && card <= 14);
    //初始化排序手牌
    sortedCards = cards.sort((a, b) => a - b);
    //初始化卡牌桶
    for (const card of sortedCards) {
        bucket[card - 3]++;
    }
}

//这里只需要看是否有连续大于五张牌就可以了
function checkStraight() {
    let continuousCount = 0;
    for (const count of bucket) {
        if (count > 0) {
            continuousCount++;
            if (continuousCount >= 5) return true;
        } else {
            continuousCount = 0;
        }
    }
    return false;
}

//找到连续的顺子
function findSequences() {
    const sequences = [];

    while (checkStraight()) {
        const seq = [];
        for (let i = 0; i < 13; i++) {
            if (bucket[i] > 0) {
                seq.push(i + 3);
                bucket[i]--;
            } else if (bucket[i] < 1 && seq.length >= 5) {
                sequences.push([...seq]);
                break;
            } else {
                break;
            }
        }
    }
    return sequences.map(seq => seq.map(card => card === 11 ? 'J' : card === 12 ? 'Q' : card === 13 ? 'K'
        : card === 14 ? 'A' : card.toString()));
}

全部评论
有完整代码不
点赞 回复 分享
发布于 03-20 23:01 北京

相关推荐

安克创新具身智能岗位大力招聘中,投递链接:https://anker-in.jobs.feishu.cn/s/iSA8v9d2,右上角切换社招/校招,搜索&ldquo;机器人&rdquo;或者&ldquo;具身智能&rdquo;可见相关岗位。算法、软件、系统、嵌入式、硬件、本体、强化学习、结构等大量岗位放出。为给全球家庭用户缔造更美好的生活,安克决心打造支撑未来十年的机器人技术栈,并借助安克成熟的产品化和市场化能力,达成商业闭环。安克的机器人技术栈和产品将围绕三个本体进行布局:本体一「二维基础型」:以扫地机器人、割草机器人为典型的平面作业机器人,是当下商业化的主力,支撑着基础业务规模。本体二「三维移动型」:包含机器狗、无人机等具有三维空间移动能力的机器人,作为安防和清洁领域的补充。本体三「三维交互型」:通过机械臂来实现复杂操作的人形/类人形机器人,代表着未来家庭智能服务的最终形态。测评和面试参考:一、笔试和面试测评:要靠拢公司价值观,可以关注安克微信公众号看看价值观历史文章,也可以去知乎搜搜华为的性格测评怎么作答,都有相似之处。行测题可以多刷一刷,整体不难。测评过不了一票否决,一定要重视并提前准备。性格测评可以参考https://www.nowcoder.com/discuss/353158733318529024,题目形式是把三个陈述按照符合程度排序,注意会有重复或接近的题目,不要前后矛盾。安克的价值观是&ldquo;第一性,求极致,共成长&rdquo;,第一性就是关注底层原理。cata测评言语理解、资料分析、图形推理各10道题,共30道,每道题作答时间60~90秒。难度中等,正常行测难度。校招笔试:容易到中等难度,多多刷题提前准备即可。面试:一定会问简历上的内容,特别是项目,另外会问重点的专业知识,还会问一些常规的问题,比如遇到困难是怎么解决的,这种都可以提前准备好,例子要具体详细有专业性。【重点】也要结合“第一性,求极致,共成长”这三个方面来回答。投递链接:https://anker-in.jobs.feishu.cn/s/iSA8v9d2,可私信跟踪进度。
安克创新 Anker
|
校招
|
超多精选岗位
点赞 评论 收藏
分享
05-22 15:20
已编辑
华南理工大学 Java
本人背景:211本软件工程,2年后端开发经验,java岗位机考:第一题&nbsp;平衡字符串第二题&nbsp;剩余银饰重量第三题&nbsp;不太记得,只过了一点用例hr资面:(1)家庭情况(2)过往工作经历&nbsp;gap&nbsp;期间在干什么(3)项目中怎么解决并发问题(4)对&nbsp;od&nbsp;了解多少&nbsp;为什么来(5)职业规划(6)兴趣爱好技术一面:常规八股&nbsp;+手撕代码(1)面向对象的特征(2)hashmap&nbsp;扩容原理(3)java&nbsp;锁有哪些&nbsp;锁升级过程(4)jvm&nbsp;怎么调优(5)设计模式了解哪些(6)单例模式讲一下(7)项目用到&nbsp;redis&nbsp;讲一下(8)redis&nbsp;缓存更新策略(9)手撕代码:给定一个公式,求&nbsp;1&nbsp;到&nbsp;n&nbsp;中满足条件的最大值&nbsp;简单的模拟保存最大值。面试官发题过来,用例全部通过技术二面:常规八股&nbsp;+手撕代码(1)Java&nbsp;序列化(2)StringBuffer&nbsp;和&nbsp;StringBuilder(3)hashmap&nbsp;和&nbsp;hashtable&nbsp;区别&nbsp;怎么保证安全;hashmap&nbsp;为什么不安全举例说明(4)linux&nbsp;用过那些命令(5)mysql&nbsp;索引有哪些(6)手写两张表的查询&nbsp;面试官发题(7)手撕代码&nbsp;&nbsp;leetcode&nbsp;037&nbsp;原题&nbsp;行星碰撞&nbsp;用了栈模拟&nbsp;面试官发题(做完才说是&nbsp;leetcode&nbsp;原题)主管面:(1)过往工作经历(2)java&nbsp;学习途径&nbsp;(3)介绍自己部门&nbsp;&nbsp;&nbsp;&nbsp;最后向大家推荐我的hr饼饼老师!真的很有耐心且会给我很多辅导和帮助!祝大家都能成功上岸!&nbsp;&nbsp;
点赞 评论 收藏
分享
海尔提前批的测评是真能给人整自闭4.16投的简历&nbsp;5.21收到的测评(据说提前批还卡学历的)&nbsp;测评包括四个部分,一个是心理测评,很常规。第二个是综合测评,涵盖工作场景应对、逻辑推断、信息获取、语句排序、数学计算、数学逻辑推断等,数学计算有些题目要花点时间思考,有些题目甚至不是算的是猜的,跟北森的相比难度偏大一些。第三个测评是笔试部分,做过难度最大的评测,总体难度跟华为的差不多了选择题20题还好,以流体力学为主,偶有传热学、工程热力学的知识,基本也都是概念相关,建议好好复习概念;简答题一道工程热力学在生活场景应用题,两道燃烧理论及应用的题目,还有一道英文题,这个没复习过我全凭印象写的;最搞的是居然还有一道计算题!!MD,这谁还能记得随便套了几个公式,定理,写了一下数据,最后咋样就管不了了,我尽力了&nbsp;最后一个是AI英语面试,这个是最坑爹的,每个英语回答10秒钟时间准备四分钟时间回答,前几个问答也就算了,后面直接给你考听力,题目都还没看完就播完了,没有任何体验&nbsp;一套做下来觉得自己信心备受打击,而且这些测评强度都很大,从发测评到提交也只给了3天时间,正好撞上老板一直给安排事考完都有点不自信了,希望后面的招聘别是这么地狱的难度
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务