【2025华为秋招机考三道编程题之一】华为校招留学生软件开发工程师-真题机考笔试/(D卷,200分)- 连续出牌数量(Java & JS & Python & C)

【2025华为秋招机考三道编程题之一】华为校招留学生软件开发工程师-真题机考笔试/(D卷,200分)- 连续出牌数量(Java & JS & Python & C)

华为的校招和社招编程考试通常覆盖了以下主要领域和知识点:

数据结构与算法:

  • 基本数据结构:数组、链表、栈、队列、哈希表、集合、树、图等。
  • 常见算法:排序(冒泡、选择、插入、快速、归并等)、查找(二分查找、广度优先搜索、深度优先搜索等)、动态规划、贪心算法、回溯法等。
  • 常见问题:字符串操作、链表操作、二叉树遍历、图遍历、最短路径问题、最大子序列问题、最长公共子序列问题、背包问题等。


计算机基础知识:

  • 操作系统:进程、线程、内存管理、文件系统、进程间通信、死锁等。
  • 计算机网络:OSI 七层模型、TCP/IP 协议栈、IP 地址、子网划分、路由协议、HTTP 协议、DNS、网络安全等。
  • 计算机组成原理:数据表示、运算器、控制器、存储器、输入输出设备、指令系统、总线、中断等。


编程语言及编程技巧:

  • 掌握至少一门主流编程语言(如 C、C++、Java、Python 等),了解语言的基本语法、数据类型、控制结构、函数、类等概念。
  • 熟悉常用库和API的使用,例如:STL(C++)、Java 标准库、Python 标准库等。
  • 熟悉编程的基本技巧,例如:调试、代码优化、内存管理、时间复杂度和空间复杂度分析等。


软件工程及项目管理:

  • 软件开发过程、软件开发方法论(如敏捷开发)、需求分析、设计、编码、测试、维护等阶段的知识。
  • 熟悉软件质量保证、软件测试方法、软件配置管理等概念。
  • 了解项目管理的基本原理,如项目规划、进度管理、风险管理、成本管理等。


数据库原理及应用:

  • 熟悉关系型数据库原理,如 MySQL、Oracle、SQL Server 等,了解数据库设计、范式、SQL 语言、事务处理、并发控制等。
  • 了解 NoSQL 数据库(如 MongoDB、Redis 等)的基本概念和应用。

在准备华为编程考试时,可以针对以上知识点进行复习,并通过在线编程平台练习

职豚教育_一站式求职引领者​www.zhitunjiaoyu.com/​编辑

题目描述

有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为0-9中的一个。游戏开始时玩家从手牌中选取一张卡牌打出,接下来如果玩家手中有和他上一次打出的手牌颜色或者数字相同的手牌,他可以继续将该手牌打出,直至手牌打光或者没有符合条件可以继续打出的手牌。

现给定一副手牌,请找到最优的出牌策略,使打出的手牌最多。

输入描述

输入为两行

第一行是每张手牌的数字,数字由空格分隔,

第二行为对应的每张手牌的颜色,用r y b g这4个字母分别代表4种颜色,字母也由空格分隔。

手牌数量不超过10。

输出描述

输出一个数字,即最多能打出的手牌的数量。

用例

输入1 4 3 4 5r y b b r
输出3
说明如果打(1, r)-> (5, r),那么能打两张。如果打(4,y) -> (4, b) -> (3, b),那么能打三张。

输入1 2 3 4r y b l
输出1
说明没有能够连续出牌的组合,只能在开始时打出一张手牌,故输出1

题目解析

1.首先,我们需要将输入的手牌按照数字和颜色进行分类。可以使用字典来存储每个数字和颜色的手牌数量。

2.然后,我们需要找到最优的出牌策略。可以从第一张手牌开始,尝试打出与其颜色或数字相同的手牌,直到无法继续打出为止。记录每次出牌的数量,并更新最大出牌数量。

3.最后,输出最大出牌数量。

JS算法源码


const readline = require("readline");

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

const lines = [];
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 2) {
    const nums = lines[0].split(" ");
    const colors = lines[1].split(" ");

    console.log(getMaxCount(nums, colors));

    lines.length = 0;
  }
});

class Card {
  constructor(num, color) {
    this.num = num;
    this.color = color;
  }
}

function getMaxCount(nums, colors) {
  const n = nums.length;

  const cards = nums.map((num, i) => new Card(num, colors[i]));

  const ans = [0];
  const used = new Set();

  dfs(cards, used, undefined, 0, ans);
  return ans[0];
}

function dfs(cards, used, last, count, ans) {
  ans[0] = Math.max(ans[0], count);

  for (let i = 0; i < cards.length; i++) {
    if (used.has(i)) continue;

    const cur = cards[i];
    if (last && last.num !== cur.num && last.color !== cur.color) continue;

    used.add(i);
    dfs(cards, used, cur, count + 1, ans);
    used.delete(i);
  }
}


Java算法源码

 import java.util.Arrays;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
    String[] colors = sc.nextLine().split(" ");

    System.out.println(getResult(nums, colors));
  }

  static class Card {
    int num;
    char color;

    public Card(int num, String color) {
      this.num = num;
      this.color = color.charAt(0);
    }
  }

  public static int getResult(int[] nums, String[] colors) {
    int n = nums.length;
    Card[] cards = new Card[n];
    for (int i = 0; i < n; i++) cards[i] = new Card(nums[i], colors[i]);

    int[] ans = {0};
    dfs(cards, new boolean[n], null, 0, ans);
    return ans[0];
  }

  public static void dfs(Card[] cards, boolean[] used, Card last, int count, int[] ans) {
    ans[0] = Math.max(ans[0], count);

    for (int i = 0; i < cards.length; i++) {
      if (used[i]) continue;

      Card cur = cards[i];
      if (last != null && last.num != cur.num && last.color != cur.color) continue;

      used[i] = true;
      dfs(cards, used, cur, count + 1, ans);
      used[i] = false;
    }
  }
}


Python算法源码
def getResult():
    nums = input().split()
    colors = input().split()

    class Card:
        def __init__(self, num, color):
            self.num = num
            self.color = color

    n = len(nums)
    cards = [Card(nums[i], colors[i]) for i in range(n)]

    ans = [0]
    used = [False] * n

    def dfs(cards, used, last, count, ans):
        ans[0] = max(ans[0], count)

        for i in range(len(cards)):
            if used[i]:
                continue

            cur = cards[i]
            if last and last.num != cur.num and last.color != cur.color:
                continue

            used[i] = True
            dfs(cards, used, cur, count + 1, ans)
            used[i] = False

    dfs(cards, used, None, 0, ans)

    return ans[0]

print(getResult())

C算法源码

 #include <stdio.h>

#define MAX(a,b) ((a) > (b) ? (a) : (b))

#define MAX_SIZE 10

typedef struct {
    int num;
    char color;
} Card;

int ans = 0;

Card cards[MAX_SIZE];
int cards_size = 0;

void dfs(int used[], Card* last, int count);

int main() {
    while (scanf("%d", &cards[cards_size].num)) {
        cards_size++;
        if (getchar() != ' ') break;
    }

    for (int i = 0; i < cards_size; i++) {
        cards[i].color = (char) getchar();
        getchar();
    }

    int used[MAX_SIZE] = {0};
    dfs(used, NULL, 0);

    printf("%d\n", ans);

    return 0;
}

void dfs(int used[], Card* last, int count) {
    ans = MAX(ans, count);

    for(int i=0; i<cards_size; i++) {
        if(used[i]) continue;

        Card cur = cards[i];

        if(last != NULL && last->num != cur.num && last->color != cur.color) continue;

        used[i] = 1;
        dfs(used, &cur, count + 1);
        used[i] = 0;
    }
}

这段 C 代码的主要目的是解决一个组合问题。通过输入一些卡片的数字和颜色信息,使用深度优先搜索(DFS)算法找出满足一定条件的卡片组合,并计算这些组合中卡片数量的最大值。

  1. 在 main 函数中,首先通过循环读取卡片的数字,确定卡片的数量 cards_size。然后再为每张卡片读取对应的颜色。之后初始化一个用于标记卡片是否已使用的数组 used ,并调用 dfs 函数进行深度优先搜索。
  2. dfs 函数是核心函数,用于执行深度优先搜索过程。
  • 首先,更新全局变量 ans,使其始终保持为已找到的最大卡片数量。
  • 然后遍历所有的卡片,对于未被使用过的卡片(通过 used 数组判断),进行条件判断。如果 last 指针不为空(表示有前一张卡片),且当前卡片的数字和颜色与前一张卡片都不同,那么就跳过该卡片。
  • 如果满足条件,将当前卡片标记为已使用(used[i] = 1),然后以当前卡片为新的“前一张卡片”,卡片数量加 1,递归调用 dfs 函数继续搜索。搜索完成后,将当前卡片标记为未使用(used[i] = 0),以便其他搜索路径可以使用该卡片。

假设输入了 3 张卡片,数字分别为 123,颜色分别为 'R''G''B'

首先,从第一张卡片开始,假设选择了第一张卡片(数字 1,颜色 'R'),此时 last 为该卡片,count 为 1,然后继续递归搜索其他卡片

如果下一张可以选择的卡片(数字 2,颜色 'G')满足与前一张卡片的条件,那么选择该卡片,count 变为 2,继续递归搜索

以此类推,通过深度优先搜索遍历所有可能的卡片选择组合,最终找到卡片数量最多的组合,将其数量存储在 ans 中并输出

清晰定位自己的职业方向:在参加校招之前,首先要明确自己的兴趣和擅长的领域,以及未来希望从事的工作方向。这样,在校招过程中可以更有针对性地选择适合自己的岗位和公司。

充分准备简历和面试:简历是求职者的第一张名片,一定要认真制作,突出自己的优势和特点。同时,面试是求职过程中非常关键的一环,需要提前了解公司背景和岗位要求,做好充分的准备。

关注行业动态和技术趋势:互联网行业变化迅速,了解最新的行业动态和技术趋势对于求职者来说非常重要。这不仅可以帮助你更好地选择适合自己的岗位,还可以在面试中展示出你对行业的了解和热情。

积极参与实习和项目经验:在校期间,尽可能多地参与实习和项目经验,这不仅可以提升自己的实践能力,还能在校招时作为自己的亮点呈现。

注意网络素养和社交礼仪:在互联网行业,网络素养和社交礼仪尤为重要。在参加校招的过程中,无论是线上交流还是线下面试,都要注意自己的言行举止,给人留下良好的第一印象。

保持积极心态和耐心:校招过程可能会遇到各种挑战和困难,但要保持积极的心态和足够的耐心。相信自己的能力和潜力,坚持不懈地努力,最终一定会找到适合自己的工作机会。

提前了解公司文化和价值观:在参加校招之前,建议提前了解目标公司的文化和价值观,看看自己是否与之契合。这样,在面试过程中可以更加自信地表达自己对公司的认同和期望。

华为机考1-1 MAX88z

希望准备参加校招的年轻人们能够充分准备、积极面对挑战,找到自己满意的工作机会。加油!

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值