华为OD机试真题 新系统2026-04-15 PythonJS 实现【小猫钓鱼纸牌游戏】

张开发
2026/4/17 23:24:49 15 分钟阅读

分享文章

华为OD机试真题 新系统2026-04-15 PythonJS 实现【小猫钓鱼纸牌游戏】
目录题目思路Code题目有两名玩家甲和乙他们玩一种“小猫钓鱼”扑克牌游戏。扑克牌为A、2、3、....J、Q、K不考虑花色都用1-13来表示然后给甲乙两人各发n张牌按给定顺序排成队列这些牌背面朝上正面朝下放置队列的第一个元素是背面的第一张牌。游戏规则如下:1.出牌与收牌-初始出牌时甲先出牌打出的牌正面朝上放在桌面的最底部然后乙出牌正面朝上放在甲的牌张上面然后甲乙轮流出牌直到触发收牌或者任意一个玩家牌出完。-如果玩家出牌后触发了收牌则把收到的一摞牌作为整体翻面后背面朝上正面朝下放到现有牌的底部然后当前收牌的玩家继续出牌。2.收牌规则-若当前打出的牌点数与桌面上之前某张牌的点数相同则触发收牌收牌的范围是两张相同点数牌之间的所有牌(含这两张)。若当前打出的牌是J并且此时桌面上已有至少一张牌(不含当前这张)则当前玩家触发收牌收牌的范围是桌面上的所有牌。若桌面上原本没有牌则J仅作为普通牌放到桌面3.游戏结束条件-若某位玩家在自己回合开始时已经没有牌可出则游戏立即结束如果此时对方还有余牌则对方获胜如果对方也无牌则平局。-若在模拟过程中出牌总次数超过一个上限(10000次)仍未结束则认为游戏进入死循环判定为平局。输入描述甲的初始牌队列和乙的初始牌队列甲乙初始手牌数量相等均为整数n(1≤n≤100)输出描述一方获胜时输出获胜方手中背面朝上最上方的那张牌的数值。若平局如果桌面无牌则输出0否则输出当前桌面上正面朝上的最上方的那张牌的数值。示例1输入:1,210,12输出12说明甲的牌堆为1,2乙的牌堆为10,12出牌顺序:甲出 1乙出 10甲出 2乙出 12甲无牌可出乙无余牌游戏结束平局。桌面牌堆为1,10,2,12平局输出桌面排队正面朝上最上牌值12.示例2输入1,31,3输出1思路典型的逻辑模拟类题目可能对大部分人来说比较难的点在于读懂题目毕竟有点长也有点饶但是读懂之后其实没有那么困难。核心在于知道用什么样的数据结构来模拟整个逻辑过程这里使用队列的方式用队列模拟双方手牌列表模拟桌面牌堆甲先出牌轮流进行收牌后当前玩家继续出牌出牌后先检查J规则值为11且桌面有其他牌 → 收全部再检查普通匹配从桌面顶部往下找最近同点数牌收两张之间所有牌含两端收到的牌按桌面原序底→顶追加到手牌末尾整体翻面后底部放置的效果回合开始时当前玩家无牌 → 游戏结束对方有牌则对方赢都无牌则平局总出牌超10000次判平局Codefrom collections import deque def solve(): a_cards list(map(int, input().strip().split(,))) b_cards list(map(int, input().strip().split(,))) hand_a deque(a_cards) hand_b deque(b_cards) table [] total_plays 0 turn 0 # 0甲, 1乙 while True: hand hand_a if turn 0 else hand_b other hand_b if turn 0 else hand_a # 当前玩家无牌游戏结束 if not hand: if other: print(other[0]) else: print(table[-1] if table else 0) return # 出牌从手牌头部取出放到桌面顶部 card hand.popleft() table.append(card) total_plays 1 # 出牌次数超限判定平局 if total_plays 10000: print(table[-1] if table else 0) return # 判断收牌 collected None if card 11 and len(table) 2: # J规则桌面有其他牌时收走全部 collected table[:] table [] else: # 普通匹配从顶部往下找最近的同点数牌 for i in range(len(table) - 2, -1, -1): if table[i] card: collected table[i:] table table[:i] break if collected: # 收牌加到手牌底部当前玩家继续出牌 hand.extend(collected) else: # 未收牌轮到对方 turn 1 - turn solve()JSconst lines require(fs).readFileSync(/dev/stdin, utf8).trim().split(\n); const handA lines[0].trim().split(,).map(Number); const handB lines[1].trim().split(,).map(Number); const table []; let totalPlays 0; let turn 0; // 0甲, 1乙 while (true) { const hand turn 0 ? handA : handB; const other turn 0 ? handB : handA; // 当前玩家无牌游戏结束 if (hand.length 0) { if (other.length 0) { console.log(other[0]); } else { console.log(table.length 0 ? table[table.length - 1] : 0); } break; } // 出牌从手牌头部取出放到桌面顶部 const card hand.shift(); table.push(card); totalPlays; if (totalPlays 10000) { console.log(table.length 0 ? table[table.length - 1] : 0); break; } // 判断收牌 let collectFrom -1; if (card 11 table.length 2) { // J规则收走桌面全部 collectFrom 0; } else { // 普通匹配从顶部往下找最近的同点数牌 for (let i table.length - 2; i 0; i--) { if (table[i] card) { collectFrom i; break; } } } if (collectFrom 0) { // 收牌加到手牌底部 const collected table.splice(collectFrom); hand.push(...collected); } else { turn 1 - turn; } }【华为od机试真题PythonJSJavaGo合集】【超值优惠】Py/JS/Java/Go合集【华为od机试真题Python】Python真题题库【华为od机试真题JavaScript】JavaScript真题题库【华为od机试真题JavaGo】JavaGo真题题库【华为od机试真题C】C真题题库【华为od机试真题C语言】C语言真题题库【华为od面试手撕代码题库】面试手撕代码题库【华为od机试面试交流群830285880】【文章底部有二维码链接可扫码加交流群】华为OD机试:二本院校有机会吗?有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。

更多文章