广联达笔试 广联达秋招 广联达笔试题 0923

笔试时间:2025年9月23日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:斗地主出牌提示

斗地主牌型规则:发牌者将牌平均分给三个玩家,剩下3张牌放在桌面上作为底牌,为地主所有。牌的大小顺序从大到小为:2、A、K、Q、J、10、9、8、7、6、5、4、3。一副牌每张牌各4张。出牌时按座次顺时针出牌,每轮出牌必须按上家牌型出牌且大于上家牌面值。若出现两个玩家均放弃出牌,则由牌面最大的玩家开启新一轮出牌。

出牌规则:

  1. 顺子出牌,牌面值连续且大于4张以上,如4 5 6 7 8
  2. 炸弹出牌,同牌面值4张牌同时出牌,如K K K K,炸弹出牌可大于任意顺子牌型
  3. 牌面大小按2、A、K、Q、J、10、9、8、7、6、5、4、3递减。例如:单张牌型4 > 3;Q > J;顺子牌型5 6 7 8 9 > 3 4 5 6 7,炸弹牌型4 4 4 4 > 3 3 3 3 > 5 6 7 8 9
  4. 其他牌型规则不允许出牌

要求:按照当前玩家手中牌型,并结合当前出牌牌面值给出类似棋牌游戏中提示功能,要求提示返回玩家手中最小可出牌型组合,以列表表示。仅限当前牌面同牌型出牌或大于当前牌型的炸弹,如没有牌型可出则返回空。

输入描述

用14表示A,用15表示2,用11表示J,用12表示Q,用13表示K。10也可组成顺子。

  • 第一行为任一时刻玩家手中的牌型,未洗牌
  • 第二行为当前出牌轮次最新出牌牌型,用于决定玩家是否可出牌,仅限定顺子出牌

输出描述

需要输出当前玩家手中牌型最小的组合

样例输入

14,2,4,5,7,2,5,9,7,10,11,12,12,13,14,2,10,8,7

6,7,8,9,10

样例输出

[7, 8, 9, 10, 11]

参考题解

解题思路:

  1. 读取和整理手牌,统计每张牌的数量
  2. 读取上家出的牌,判断是否为炸弹
  3. 寻找能出的牌: 如果上家出炸弹,只能出更大的炸弹如果上家出顺子,优先找更大的顺子,找不到再考虑炸弹
  4. 找到最小的可出牌型组合

C++:

#include <bits/stdc++.h>
using namespace std;

vector<int> findBestPlay(vector<int>& cardCounts, vector<int>& uniqueSortedCards, vector<int>& lastPlay) {
    vector<int> bestPlay;
    bool isLastPlayBomb = lastPlay.size() == 4 && lastPlay[0] == lastPlay[3];
    
    vector<int> smallestStraight;
    if (!isLastPlayBomb) {
        int lastPlayLen = lastPlay.size();
        int lastPlayRank = lastPlay[0];
        for (int startCard : uniqueSortedCards) {
            if (startCard > lastPlayRank) {
                bool canFormStraight = true;
                for (int i = 0; i < lastPlayLen; i++) {
                    if (cardCounts[startCard + i] == 0) {
                        canFormStraight = false;
                        break;
                    }
                }
                if (canFormStraight) {
                    for (int i = 0; i < lastPlayLen; i++) {
                        smallestStraight.push_back(startCard + i);
                    }
                    break;
                }
            }
        }
    }
    
    vector<int> smallestBomb;
    int lastBombRank = isLastPlayBomb ? lastPlay[0] : 0;
    for (int rank = 3; rank <= 15; rank++) {
        if (rank > lastBombRank && cardCounts[rank] >= 4) {
            for (int i = 0; i < 4; i++) {
                smallestBomb.push_back(rank);
            }
            break;
        }
    }
    
    if (isLastPlayBomb) {
        if (!smallestBomb.empty()) {
            bestPlay = smallestBomb;
        }
    } else {
        if (!smallestStraight.empty()) {
            bestPlay = smallestStraight;
        } else if (!smallestBomb.empty()) {
            bestPlay = smallestBomb;
        }
    }
    
    return bestPlay;
}

int main() {
    string line;
    getline(cin, line);
    vector<int> cardCounts(18, 0);
    set<int> uniqueCardsSet;
    
    stringstream ss(line);
    string token;
    while (getline(ss, token, ',')) {
        int card = stoi(token);
        cardCounts[card]++;
        uniqueCardsSet.insert(card);
    }
    
    vector<int> uniqueSortedCards(uniqueCardsSet.begin(), uniqueCardsSet.end());
    sort(uniqueSortedCards.begin(), uniqueSortedCards.end());
    
    getline(cin, line);
    vector<int> lastPlay;
    stringstream ss2(line);
    while (getline(ss2, token, ',')) {
        lastPlay.push_back(stoi(token));
    }
    sort(lastPlay.begin(), lastPlay.end());
    
    vector<int> result = findBestPlay(cardCounts, uniqueSortedCards, lastPlay);
    
    cout << "[";
    for (int i = 0; i < result.size(); i++) {
        if (i > 0) cout << ",";
        cout << result[i];
    }
    cout << "]" << endl;
    
    return 0;
}

Java:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] handStr = scanner.nextLine().split(",");
        int[] cardCounts = new int[18];
        Set<Integer> uniqueCardsSet = new HashSet<>();
        
        for (String s : handStr) {
            int card = Integer.parseInt(s.trim());
            cardCounts[card]++;
            uniqueCardsSet.add(card);
        }
        
        List<Integer> uniqueSortedCards = new ArrayList<>(uniqueCardsSet);
        Collections.sort(uniqueSortedCards);
        
        String[] lastPlayStr = scanner.nextLine().split(",");
        List<Integer> lastPlay = new ArrayList<>();
        for (String s : lastPlayStr) {
            lastPlay.add(Integer.parseInt(s.trim()));
        }
        Collections.sort(lastPlay);
        
        List<Integer> result = findBestPlay(cardCounts, uniqueSortedCards, lastPlay);
        System.out.println(result.toString().replace(" ", ""));
        scanner.close();
    }
    
    private static List<Integer> findBestPlay(int[] cardCounts, List<Integer> uniqueSortedCards, List<Integer> lastPlay) {
        List<Integer> bestPlay = new ArrayList<>()

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

不愿透露姓名的神秘牛友
09-27 09:43
下面是秋招面试中已复盘的八股,发出来希望对大家有帮助。字节1.虚拟内存是什么?有什么了解?2.怎么根据段表/页表找到需要的数据?3.MySQL有几种隔离等级呢?4.举个例子介绍下RC和RR的区别?5.RR和串行化的区别是什么呢?6.RR级别下可能出现幻读的例子?7.Redis有哪些数据结构呢?8.Zset的底层结构?9.跳表的查询过程10.跳表节点层数的设置11.为什么Zset用跳表不用平衡树?12.宏观的讲一下Java和C++在内存管理上的区别?13.Java垃圾回收算法?14.C++一定要手动释放内存吗?15.GCRoots都有哪些?16.标记复制算法会不会STW?拼多多一面1.说一下Java运行时数据区域2.说一下类加载机制3.说一下双亲委派机制,为什么要双亲委派?4.双亲委派机制如何破坏?5.Tomcat为什么要打破双亲委派?是如何打破的?6.堆的内存结构?7.为什么要拆分为新生代和老年代?8.请你介绍一下G1垃圾回收器9.介绍一下对于分布式锁的理解10.线上扩容数据库表怎么实现?怎么实现数据的平滑迁移?11.volatile关键字作用是什么?应用场景是什么?美团一面1.进程和线程的区别?2.线程之间通信的方式?3.进程之间通信的方式?4.说一下类加载机制以及双亲委派5.说一下MySQL的索引6.说一下Redis的跳表7.说一下你对大模型的实践经验8.分享一下怎么从0到1学习一个复杂工具或者技术,这个过程遇到了哪些问题?快手一面1.MQ底层基于磁盘存储,是怎么优化的那么快的呢?2.Redis扩容和缩容怎么保证缓存不大面积失效呢?3.Redis热点问题怎么解决?4.讲下数据库底层是怎么设计的?5.电商,消费者购买商品,怎么保证商家和消费者都能很快的看到自己的订单?数据量比较大,要支持比较高的请求,RT也要保证,怎么设计数据库?6.你来开发一个接口,你的接口内部会依赖对象的下游,还有别的服务会调用你的接口,怎么保证稳定性这一块的设计呢?得物一面1.支付订单五分钟提醒支付如何设计?2.请你讲一下MySQL事务特性以及原理3.索引失效的场景?4.Kafka消息投递到消费的链路介绍一下5.了解过分布式ID的生成算法吗?6.如何学习之前没有学过的技术并应用的?7.JWT的设计的局限性是什么?科大讯飞一面1.请你介绍一下Java线程池2.一个IO类型的任务,线程设置多大比较合适?3.请你说一下NIO是怎么实现的?4.MySQL主从复制是怎么实现的?5.主从复制结构中自动的主从替换怎么实现的?6.分库分表可以说一下吗?7.商品订单,它里面有商家有买家、有商品,那么你觉得应该通过什么维度去分比较好呢?8.说一下微服务涉及到的组件9.说一下gateway网关的作用10.讲一下Docker,跟虚拟机的区别?11.大模型有了解过哪些呢?讲一下MCP的作用,怎么把多个智能体的能力给串起来?12.那平时有用大模型去在生活场景中有用它做些什么呢?13.大模型效果最好的场景是什么?大模型效果最差的场景是什么?14.平时有关注一些新的技术吗?学习新知识的方法?小米一面1.你觉得一张表数据量在多大比较合适?为什么是2000w左右?2.如果说有一个后台想要统计最近一个月符合一定查询条件的这个数据总共有多少条。现在你分了很多表,怎么去查询?3.上面问题如果是模糊查询怎么办?4.这个MySQL慢怎么办呢?怎么去排查呢?5.常见的索引类型有哪些呢?6.索引失效的条件有哪些呢?7.说一下最左匹配原则8.count(*)和count(1)哪一个更快?9.讲一下索引下推10.讲一下MVCC11.如何防止优惠券不超卖?12.讲一下MySQL的乐观锁悲观锁13.讲一下MySQL的行锁14.讲一下undolog的作用15.说一下订单半小时不支付就取消怎么实现?16.Kafka如何保证消息不丢失?17.Kafka读主节点还是从节点?18.Kafka为什么那么快呢?小红书一面场景题,如何实现Kafka多线程顺序消费?拼多多二面1.讲一下Java中HashMap的实现?2.为什么要使用红黑树呢?3.使用自定义对象设置为key使用HashMap需要做什么?4.hashcode和equals5.扩容期间对HashMap的读写操作会受影响吗?6.请你说一下对乐观锁和悲观锁的理解7.讲一下实际对乐观锁的应用场景8.请你讲一下volatile的作用
梦媛媛:同学,瞅瞅我司,医疗独角兽,名额有限,先到先得,我的主页最新动态,绿灯直达,免笔试~
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务