【2023-03-05】米哈游春招笔试三道编程题

恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经,目前已更新至华为、字节…
作者@TechGuide【全网同名】
点赞再看,养成习惯,您动动手指对原创作者意义非凡

2023大厂真题解析请移步我的专栏【进阶版】2023最新大厂笔试真题 & 题解

第一题:花酿鸡

题目描述

米小游准备做一些甜甜花酿鸡。

已知做一个甜甜花酿鸡,需要 22 个甜甜花和 22 个禽肉。米小游现在有 a 个甜甜花, b 个禽肉,以及 c 个万能食材(每个万能食材可以当作一个甜甜花或者一个禽肉)

米小游想知道,自己最多可以做多少只甜甜花酿鸡?

输入描述

输入三个整数a, b, c , 用空格隔开。

3 3 3

输出描述

一个整数,代表可以制作的甜甜花酿鸡的最大数量。

2

说明

可以将两个万能食材当作一个甜甜花和一个禽肉,所以是 4 4 1 可以制作两个甜甜花酿鸡。

代码

Python版本

a, b, c = map(int, input().split())
if a > b:
    a, b = b, a
f = min(b - a, c)
c -= f
a += f
a += c // 2
print(a // 2)
# vx公众号关注TechGuide 实时题库 闪电速递。
# 代码可能需要少量调试,更多欢迎进入菜单【真题爆料】讨论题解思路

Java版本

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long a, b, c;
        a = sc.nextLong();
        b = sc.nextLong();
        c = sc.nextLong();
        if (a > b) {
            long temp = a;
            a = b;
            b = temp;
        }
        long f = Math.min(b - a, c);
        c -= f;
        a += f;
        a += c / 2;
        System.out.println(a / 2);
    }
}
// vx公众号关注TechGuide 实时题库 闪电速递
// 代码可能需要少量调试,更多欢迎进入【真题爆料】讨论题解思路

第二题:n 皇后

题目描述

米小游最近在研究 n 皇后问题。 所谓 n 皇后问题,指 n×n 的棋盘中,放置 n 个皇后,满足两两之间不会互相攻击。

每个皇后可以攻击同一行、同一列以及同一 4545 度角斜线和 135135 度角斜线上的所有其他皇后。

米小游拿到了一个 n×n 的棋盘,目前已经放置了一些皇后,米小游希望再放置一个皇后, 满足所有的皇后不会互相攻击。

你能帮米小游求出有多少种放置方案吗?

输入描述

第一行输入一个正整数 n ,代表棋盘大小。

接下来的 n 行,每行输入一个仅由 … 和 ∗∗ 组成的字符串,其中 ∗∗ 代表放置了一个皇后, … 代表未放置皇后。

保证输入的棋盘中没有两个皇后会互相攻击。1≤n≤1000

3
.*.
...
...

输出描述

输出米小游有多少种放置方案。

2

代码

Python版本

n = int(input())
maxn = 1005
a = [[0] * maxn for _ in range(maxn)]
c = [0] * maxn
r = [0] * maxn
x = [0] * (maxn * 2)
y = [0] * (maxn * 2)
ok = True
for i in range(1, n + 1):
    t = input()
    t = '#' + t
    for j in range(1, n + 1):
        if t[j] == '*':
            a[i][j] = 1
            if r[i] or c[j] or x[i - j + n] or y[i + j]:
                ok = False
            r[i] += 1
            c[j] += 1
            x[i - j + n] += 1
            y[i + j] += 1
if not ok:
    print(0)
    exit(0)
cnt = 0
for i in range(1, n + 1):
    for j in range(1, n + 1):
        if a[i][j] == 1:
            continue
        if r[i] or c[j] or x[i - j + n] or y[i + j]:
            continue
        cnt += 1
print(cnt)
# vx公众号关注TechGuide 实时题库 闪电速递
# 代码可能需要少量调试,更多欢迎进入【真题爆料】讨论题解思路

Java版本

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        final int maxn = 1005;
        int[][] a = new int[maxn][maxn];
        int[] c = new int[maxn], r = new int[maxn], x = new int[maxn * 2], y = new int[maxn * 2];
        int n = sc.nextInt();
        boolean ok = true;
        for (int i = 1; i <= n; i++) {
            String t = sc.next();
            t = '#' + t;
            for (int j = 1; j <= n; j++) {
                if (t.charAt(j) == '*') {
                    a[i][j] = 1;
                    if (r[i] || c[j] || x[i - j + n] || y[i + j]) {
                        ok = false;
                    }
                    r[i]++;
                    c[j]++;
                    x[i - j + n]++;
                    y[i + j]++;
                }
            }
        }
        if (!ok) {
            System.out.println("0");
            return;
        }
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (a[i][j] == 1) continue;
                if (r[i] || c[j] || x[i - j + n] || y[i + j]) continue;
                cnt++;
            }
        }
        System.out.println(cnt);
    }
}
// vx公众号关注TechGuide 实时题库 闪电速递
// 代码可能需要少量调试,更多欢迎进入【真题爆料】讨论题解思路

第三题:树的染色

题目描述

米小游拿到了一棵树, 其中每条边被染成了红色或者蓝色。

米小游想选择一个点作为起点, 经过一些路径到达一 个终点,使得路径上相邻的两条边颜色不同。

米小游想知道,路径长度的最大值是多少?

输入描述

第一行输入一个正整数 n , 代表节点数量。

接下来的 n−1 行,每行输入两个正整数 u,v 和一个字符 chr ,代表节点 u 和节点 v 有一条边连接。

若为 ′R′ 代表这条边是红色, ′B′ 代表这条边是蓝色。

1≤n≤105

1≤u,v≤n

保证输入的是一颗树。

4
1 2 R
2 3 B
3 4 B

输出描述

一个正整数,代表米小游可以选择的路径最大长度。

2

说明

选择 1−2−31−2−3 的路径即可。

代码

Python版本

import sys
sys.setrecursionlimit(100000)

MAXN = 2 * 100000 + 5
n = 0
edge = [[] for i in range(MAXN)]
dp = [[0 for j in range(2)] for i in range(MAXN)]
maxn = 0

def dfs(u, fa):
    global maxn
    if len(edge[u]) == 1 and edge[u][0][0] == fa: # 叶子节点直接 return,因为叶子节点的两个dp值肯定是0
        return
    for i in range(len(edge[u])):
        now = edge[u][i]
        v, col = now[0], now[1]
        if v == fa: # 如果是父节点,continue,因为我们讨论的是以u为根节点的子树,而u的父节点肯定不属于这颗子树
# vx公众号关注TechGuide 实时题库 闪电速递
# 代码可能需要少量调试,更多欢迎进入【真题爆料】讨论题解思路

Java版本

import java.util.*;
import java.io.*;

public class Main {
    static final int MAXN = 2 * 100000 + 5;
    static int n;
    static Vector<Pair<Integer, Integer>>[] edge = new Vector[MAXN];
    static int[][] dp = new int[MAXN][2];
    static int maxn = 0;

    static void dfs(int u, int fa) {
        if (edge[u].size() == 1 && edge[u].get(0).first == fa) return; // 叶子节点直接 return,因为叶子节点的两个dp值肯定是0
        for (int i = 0; i < edge[u].size(); i++) {
            Pair<Integer, Integer> now = edge[u].get(i);
            int v = now.first;
            if (v == fa) continue; // 如果是父节点,continue,因为我们讨论的是以u为根节点的子树,而u的父节点肯定不属于这颗子树的
            dfs(v, u); // 得到子节点答案
            int col = now.second;
            dp[u][col] = Math.max(dp[u][col], dp[v][col ^ 1] + 1); // dp状态转移,用子节点v更新u
            maxn = Math.max(maxn, dp[u][0] + dp[u][1]); // 记录答案
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        int u, v;
        char ch;
        for (int i = 1; i <= n; i++) {
            edge[i] = new Vector<Pair<Integer, Integer>>();
        }
        for (int i = 1; i <= n - 1; i++) {
            u = sc.nextInt();
            v = sc.nextInt();
            ch = sc.next().charAt(0);
            edge[u].add(new Pair<Integer, Integer>(v, ch == 'R' ? 1 : 0));
            edge[v].add(new Pair<Integer, Integer>(u, ch == 'R' ? 1 : 0)); // 建图
        }
        dfs(1, 0);
        System.out.println(maxn);
    }
}

class Pair<A, B> {
    A first;
    B second;

    public Pair(A first, B second) {
        this.first = first;
        this.second = second;
    }
}
// vx公众号关注TechGuide 实时题库 闪电速递
// 代码可能需要少量调试,更多欢迎进入【真题爆料】讨论题解思路

你可能感兴趣的:(大厂笔试真题解析,java,算法,开发语言)