【华为笔试题汇总】2024-04-17-华为春招笔试题-三语言题解(Python/Java/Cpp)

马肤
这是懒羊羊

🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序

✨ 本系列打算持续跟新华为近期的春秋招笔试题汇总~

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

文章目录

    • 🔮01.扑克牌消消乐
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
      • ⚗️02.公司部门风险评估
        • 题目描述
        • 输入格式
        • 输出格式
        • 样例输入
        • 样例输出
        • 数据范围
        • 题解
        • 参考代码
        • 🎀 03.城市应急疏散
          • 题目描述
          • 输入格式
          • 输出格式
          • 样例输入
          • 样例输出
          • 数据范围
          • 题解
          • 写在最后
          • 📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

            本次华为的笔试不算难哦,虽然考试的时候题目长了点,但总体代码和思维量都不大

            🔮01.扑克牌消消乐

            题目描述

            K小姐最近沉迷于一款扑克牌消除游戏。游戏规则如下:从一副扑克牌中随机抽取 n n n 张牌组成一个序列,如果有连续的 3 3 3 张相同牌号的卡牌,则这 3 3 3 张卡牌可以消除。消除后,剩余卡牌按照当前顺序重新合并成新的序列,继续寻找可以消除的卡牌组合,直到无法再消除为止。

            需要注意的是,如果存在连续的 4 4 4 张相同牌号的卡牌,在消除后会剩余 1 1 1 张该牌号的卡牌。

            现在,K小姐想知道最后剩余的卡牌序列是什么样的,你能帮助她吗?

            输入格式

            第一行包含一个正整数 n n n( 1 ≤ n ≤ 52 1 \leq n \leq 52 1≤n≤52),表示抽取的卡牌数量。

            第二行包含 n n n 个以空格分隔的字符串,表示抽取的卡牌序列,卡牌号仅包含 2 2 2- 10 10 10, A A A, J J J, Q Q Q, K K K。

            输出格式

            输出一个字符串,表示最终剩余的卡牌号序列,卡牌号之间以空格分隔。如果最终没有卡牌剩余,则输出 0 0 0。

            样例输入

            10
            3 A 2 2 2 A A 7 7 7
            

            样例输出

            3
            

            数据范围

            • 1 ≤ n ≤ 52 1 \leq n \leq 52 1≤n≤52
            • 卡牌号仅包含 2 2 2- 10 10 10, A A A, J J J, Q Q Q, K K K。

              题解

              这是一道模拟题,可以使用栈来模拟卡牌的消除过程。具体步骤如下:

              1. 将输入的卡牌序列依次放入栈中。
              2. 在放入每张卡牌时,检查栈顶是否存在与当前卡牌相同的牌号。
                • 如果存在,则统计相同牌号的数量,直到栈顶的卡牌牌号不同或栈为空为止。
                • 如果相同牌号的数量等于 3 3 3,则将这 3 3 3 张卡牌从栈中弹出。
                • 重复步骤 2 2 2,直到所有卡牌都放入栈中。
                • 最后,将栈中剩余的卡牌依次输出,如果栈为空,则输出 0 0 0。

              时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)。

              参考代码

              • Python
                n = int(input())
                cards = input().split()
                stack = []
                for card in cards:
                    stack.append(card)
                    while len(stack) >= 3 and stack[-1] == stack[-2] == stack[-3]:
                        for _ in range(3):
                            stack.pop()
                if not stack:
                    print(0)
                else:
                    print(' '.join(stack))
                
                • Java
                  import java.util.*;
                  public class Main {
                      public static void main(String[] args) {
                          Scanner sc = new Scanner(System.in);
                          int n = sc.nextInt();
                          String[] cards = new String[n];
                          for (int i = 0; i = 3 && stack.get(size - 1).equals(stack.get(size - 2)) && stack.get(size - 2).equals(stack.get(size - 3))) {
                                  for (int i = 0; i  
                   
                  
                  • Cpp
                    #include 
                    #include 
                    #include 
                    using namespace std;
                    int main() {
                        int n;
                        cin >> n;
                        vector cards(n);
                        for (int i = 0; i > cards[i];
                        }
                        
                        vector stack;
                        for (string card : cards) {
                            stack.push_back(card);
                            int size = stack.size();
                            while (size >= 3 && stack[size - 1] == stack[size - 2] && stack[size - 2] == stack[size - 3]) {
                                for (int i = 0; i  m >> n;
                        unordered_set roots;
                        for (int i = 0; i > dept >> parent >> level >> num;
                            if (parent == "*") {
                                roots.insert(dept);
                            } else {
                                graph[parent].push_back(dept);
                            }
                            if (level == 0) {
                                risks1[dept] = num;
                            } else {
                                risks2[dept] = num;
                            }
                        }
                        int cnt = 0;
                        for (const string& root : roots) {
                            auto risks = dfs(root);
                            if (5 * risks.first + 2 * risks.second > m) {
                                cnt++;
                            }
                        }
                        cout 
                        public static void main(String[] args) {
                            Scanner sc = new Scanner(System.in);
                            int n = sc.nextInt();
                            int[][] dist = new int[n][n];
                            for (int i = 0; i  
                     
                    
                    • Cpp
                      #include 
                      #include 
                      #include 
                      #include 
                      using namespace std;
                      const int INF = 0x3f3f3f3f;
                      int main() {
                          int n;
                          cin >> n;
                          vector dist(n, vector(n));
                          for (int i = 0; i > dist[i][j];
                                  if (dist[i][j] == -1) {
                                      dist[i][j] = INF;
                                  }
                              }
                          }
                          vector cap(n);
                          for (int i = 0; i > cap[i];
                          }
                          int x, p;
                          cin >> x >> p;
                          vector d(n, INF);
                          d[x] = 0;
                          priority_queue q;
                          q.emplace(0, x);
                          while (!q.empty()) {
                              auto [du, u] = q.top();
                              q.pop();
                              if (du > d[u]) {
                                  continue;
                              }
                              for (int v = 0; v = p) {
                                  break;
                              }
                              ans.push_back(i);
                              total_cap += ci;
                          }
                          for (int i = 0; i 

文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复:表情:
评论列表 (暂无评论,0人围观)

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码