灵犀互娱笔试 灵犀互娱笔试题 0816

笔试时间:2025年8月16日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:矿工宝石采集

在一款名为"地下城探险"的挖矿游戏中,有n位矿工准备进入矿洞采集宝石。每位矿工都有一个挖掘能力值,代表他们能够挖掘的宝石硬度上限。

矿洞中有m颗宝石,每颗宝石都有一个硬度值。

每位矿工只能采集一颗宝石,且只能采集硬度不超过自己挖掘能力的宝石。为了最大化收益,矿主希望尽可能多地让矿工采集到宝石。

请你计算最多有多少位矿工可以成功采集到宝石。

输入描述

第一行输入两个整数 n 和 m,分别代表矿工的数量和宝石的数量。

第二行输入 n 个整数,表示每位矿工的挖掘能力值。

第三行输入 m 个整数,表示每颗宝石的硬度值。

输出描述

输出一个整数,表示最多有多少位矿工可以成功采集到宝石。

补充说明:0 ≤ n, m ≤ 1000 矿工能力值和宝石硬度值均为正整数,范围在[1, 1000]之间

样例输入

3 5

7 2 9

1 5 10 3 8

样例输出

3

参考题解

这是一个典型的贪心算法问题。为了让尽可能多的矿工采到宝石,我们应该优先满足能力较弱的矿工,让他们去采集硬度较低的宝石。因为能力强的矿工可以采集硬度高和硬度低的宝石,而能力弱的矿工选择范围很小。具体步骤如下:将矿工的挖掘能力值和宝石的硬度值分别从小到大进行排序。使用两个指针,一个指向能力最弱的矿工,另一个指向硬度最低的宝石。遍历所有矿工,对于当前矿工,我们尝试为他寻找硬度最低且他能开采的宝石。如果当前矿工的能力值大于或等于当前宝石的硬度值,则表示可以成功匹配。我们将成功匹配的矿工数加一,然后同时考虑下一位矿工和下一颗宝石。如果当前矿工的能力值小于当前宝石的硬度值,说明这位矿工无法开采这颗宝石(也无法开采后面更硬的宝石),所以我们只能寄希望于下一位能力更强的矿工来开采这颗宝石。因此,我们只移动矿工指针,宝石指针保持不变。当任何一个指针超出列表范围时,循环结束。

C++:

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    if (!(cin >> n >> m)) return 0;

    vector<int> miners(n), gems(m);
    for (int i = 0; i < n; ++i) cin >> miners[i];
    for (int j = 0; j < m; ++j) cin >> gems[j];

    // 将矿工能力与宝石硬度从小到大排序
    sort(miners.begin(), miners.end());
    sort(gems.begin(), gems.end());

    // 双指针匹配
    int i = 0;      // 矿工指针
    int j = 0;      // 宝石指针
    int matched = 0; // 成功匹配的矿工数量

    while (i < n && j < m) {
        if (miners[i] >= gems[j]) {
            // 当前矿工能开采当前宝石,匹配成功
            ++matched;
            ++i;
            ++j;
        } else {
            // 当前矿工能力不足,换下一个更强的矿工
            ++i;
        }
    }

    cout << matched << "\n";
    return 0;
}

Java:

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

/**
 * 等价于给定的 Python 版本:
 * 输入:
 *  n m
 *  n 个矿工能力
 *  m 个宝石硬度
 * 输出:最大匹配数量
 */
public class Main {
    // 快速输入
    static class FastScanner {
        private final InputStream in;
        private final byte[] buffer = new byte[1 << 16];
        private int ptr = 0, len = 0;

        FastScanner(InputStream is) { this.in = is; }

        private int read() throws IOException {
            if (ptr >= len) {
                len = in.read(buffer);
                ptr = 0;
                if (len <= 0) return -1;
            }
            return buffer[ptr++];
        }

        int nextInt() throws IOException {
            int c, s = 1, x = 0;
            do { c = read(); } while (c <= ' '); // 跳过空白
            if (c == '-') { s = -1; c = read(); }
            while (c > ' ') {
                x = x * 10 + (c - '0');
                c = read();
            }
            return x * s;
        }
    }

    public static void main(String[] args) throws Exception {
        FastScanner fs = new FastScanner(System.in);

        int n = fs.nextInt();
        int m = fs.nextInt();

        int[] miners = new int[n];
        int[] gems = new int[m];

        for (int i = 0; i < n; i++) miners[i] = fs.nextInt();
        for (int j = 0; j < m; j++) gems[j] = fs.nextInt();

        // 将矿工能力与宝石硬度从小到大排序
        Arrays.sort(miners);
        Arrays.sort(gems);

        // 双指针匹配
        int i = 0;       // 矿工指针
        int j = 0;       // 宝石指针
        int matched = 0; // 成功匹配的矿工数量

        while (i < n && j < m) {
            if (miners[i] >= gems[j]) {
                // 当前矿工能开采当前宝石,匹配成功
                matched++;
                i++;
                j++;
            } else {
                // 当前矿工能力不足,换下一个更强的矿工
                i++;
            }
        }

        System.out.println(matched);
    }
}

Python:

def solve():
    """
    主函数,用于读取输入、处理数据并输出结果。
    """
    # 读取第一行:矿工数量 n 和宝石数量 m
    # input().split() 将输入的一行按空格分割成字符串列表
    # map(int, ...) 将列表中的每个字符串转换为整数
    n, m = map(int, input().split())

    # 读取第二行:n 位矿工的挖掘能力
    miners_ability = list(map(int, input().split()))

    # 读取第三行:m 颗宝石的硬度
    gems_hardness = list(map(int, input().split()))

    # 将矿工能力和宝石硬度都从小到大排序
    miners_ability.sort()
    gems_hardness.sort()

    # 初始化指针和计数器
    miner_ptr = 0# 指向当前考虑的矿工
    gem_ptr = 0    # 指向当前考虑的宝石
    successful_miners = 0# 成功匹配的矿工数量

    # 当矿工和宝石都还有剩余时进行循环
    while miner_ptr < n and gem_ptr < m:
        # 如果当前矿工的能力足以开采当前宝石
        if miners_ability[miner_ptr] >= gems_hardness[gem_ptr]:
            # 匹配成功
            successful_miners += 1
            # 考虑下一位矿工
            miner_ptr += 1
            # 考虑下一颗宝石(因为这颗已经被开采)
            gem_ptr += 1
        else:
            # 当前矿工能力不足,无法开采这颗宝石
            # 只能让能力更强的下一位矿工来尝试
            miner_ptr += 1

    # 输出最终结果
    print(successful_miners)

# 调用函数执行
solve()

第二题:循环节

给出两个正整数 p 和 q, 根据 p / q 的结果进行输出:若为有限小数则输出 "0".若为无线循环则输出 p / q 的循环节.若为无限不循环小数则输出 "Wow!".

输入描述

第一行为一个正整数 T, 表示有多少组数据

接下来 T 行, 每行包含两个正整数 (空格分隔), 前面的数字表示 p, 后面的数字表示 q

输出描述

T 行, 每行一个整数表示对应数据组的答案。

样例输入

4

1 4

2 3

5 6

8 7

样例输出

0

6

3

142857

说明:

1 / 4 = 0.25

2 / 3 = 0.666...

5 / 6 = 0.9333...

8 / 7 = 1.142857142857142857...

参考题解

判断有限小数: 一个分数 p/q 是有限小数的充要条件是,当分数化为最简形式时,分母 q 的质因数只有 2 和 5。我们可以通过不断将 q 除以 2 和 5,如果最后 q 变为 1,那么它就是有限小数。寻找循环节: 如果分数是无限循环小数,我们可以通过模拟长除法的过程来找到循环节。在长除法中,我们计算的是余数。首先,我们计算 p 除以 q 的整数部分,这部分不影响循环节。我们真正关心的是小数部分,它由 p % q 决定。我们用当前的余数 r 乘以 10,然后除以 q,得到小数位上的一位数字,同时产生一个新的余数。我们重复这个过程。当某一个余数在之前已经出现过时,就意味着循环开始了。从上一次出现该余数的位置到当前位置之间的所有小数位数字,就构成了循环节。我们可以用一个字典或哈希表来记录出现过的余数以及它们出现的位置。关于无限不循环小数: 有理数(两个整数相除的结果)的小数表示只可能是有限小数或无限循环小数。无限不循环小数是无理数(如 π, √2),在本题的设定下(输入为两个整数 p 和 q)不可能出现,所以不需要输出 "Wow!"。

C++:

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

/*
 * 按照给定 Python 代码的逻辑:
 * 1) 有限小数判断:直接在 q 上去掉因子 2 和 5(不与 p 先约分)
 * 2) 否则用长除法找循环节:记录余数首次出现的位置
 * 输入:
 *   T
 *   接着 T 行:p q
 * 输出:
 *   如果有限小数输出 "0",否则输出循环节字符串
 */
static string find_repeating_cycle(long long p, long long q) {
    // 有限小数判断:不先约分,直接在 q 上消去 2 和 5
    long long temp_q = q;
    while (temp_q % 2 == 0) temp_q /= 2;
    while (temp_q % 5 == 0) temp_q /= 5;
    if (temp_q == 1) return "0";

    // 否则:找循环节
    long long remainder = p % q;
    if (remainder < 0) remainder += q; // 以防 p 为负

    unordered_map<long long, int> seen; // 余数 -> 小数位索引
    vector<char> digits;                // 小数各位(字符形式)

    while (remainder != 0 && !seen.count(remainder)) {
        seen[remainder] = (int)digits.size();
        remainder *= 10;
        long long digit = remainder / q;
        digits.push_back(char('0' + (int)digit));
        remainder %= q;
        if (remainder < 0) remainder += q;
    }

    if (remainder == 0) {
        // 按照原代码的健壮性返回 "0"
        return "0";
    } else {
        // 循环开始位置
        int start = seen[remainder];
        // 从 start 到末尾就是循环节
        return string(digits.begin() + start, digits.end());

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

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

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

全部评论

相关推荐

03-21 20:22
门头沟学院
点赞 评论 收藏
分享
03-24 12:36
门头沟学院 Java
秋招跑了大半年,前前后后做了几十家公司的笔试,从互联网大厂到量化私募,从国企总行到游戏公司,真的见识了什么叫&nbsp;“没有最难,只有更难”。1.&nbsp;头部量化私募(九坤、幻方、灵均、宽德)难度天花板,没有之一,能完整做完的都是真大神。难在哪里:题型极其硬核,完全不是互联网笔试的量级。除了超难的算法题(普遍是&nbsp;LeetCode&nbsp;Hard&nbsp;+&nbsp;难度,还会涉及竞赛题),还有大量的概率论、线性代数、随机过程、高数证明题,甚至还有&nbsp;C++&nbsp;底层原理、Linux&nbsp;内核相关的硬核选择题,对数学和编程功底的要求拉到极致。真实体感:我做九坤的笔试,120&nbsp;分钟,10&nbsp;道选择&nbsp;+&nbsp;3&nbsp;道编程&nbsp;+&nbsp;2&nbsp;道证明题,选择题一半靠蒙,编程题一道没完整&nbsp;AC,证明题直接空着,考完直接怀疑人生,非科班&nbsp;+&nbsp;数学功底弱的,直接会被劝退。2.&nbsp;华为「天才少年计划」/&nbsp;高端岗位笔试普通&nbsp;OD&nbsp;岗的笔试难度就不低,天才少年&nbsp;/&nbsp;高端研发岗的笔试,更是地狱级。难在哪里:题量超大,难度拉满,对代码的时间、空间复杂度要求极其严格。通常是&nbsp;5&nbsp;道算法题,150&nbsp;分钟,几乎全是&nbsp;Hard&nbsp;难度,涉及动态规划、图论、复杂模拟、数据结构设计,很多题都有隐藏坑,暴力解法直接超时,必须想到最优解才能&nbsp;AC。真实体感:身边的&nbsp;985&nbsp;硕学长,刷了&nbsp;600&nbsp;多道&nbsp;LeetCode,做华为高端岗的笔试,也只&nbsp;AC&nbsp;了&nbsp;2&nbsp;道半,对边界情况的处理、代码优化能力的要求,远比普通大厂高得多。3.&nbsp;腾讯游戏&nbsp;/&nbsp;米哈游&nbsp;游戏客户端&nbsp;/&nbsp;引擎开发岗笔试游戏圈的笔试,是出了名的难,完全是另一个维度的考核。难在哪里:不只是考算法,更是考游戏开发的硬核功底。题型覆盖&nbsp;C++&nbsp;底层原理、计算机图形学、OpenGL/DirectX、物理引擎、数据结构、操作系统,还有超难的算法编程题,很多题都是针对游戏开发场景设计的,没接触过的话,连题干都读不懂。真实体感:做米哈游的客户端开发笔试,选择题一半都是图形学和&nbsp;C++&nbsp;内存管理的硬核题,编程题考了游戏里的碰撞检测算法,完全没接触过的话,根本无从下手,非游戏开发方向的,大概率会直接交白卷。4.&nbsp;字节跳动&nbsp;算法岗&nbsp;/&nbsp;后端开发岗笔试互联网大厂里,字节的笔试难度是公认的第一梯队,虐哭了无数校招生。难在哪里:题量超大,时间极紧,难度梯度离谱。通常是&nbsp;40&nbsp;道行测&nbsp;+&nbsp;4&nbsp;道算法题,120&nbsp;分钟完成。行测题烧脑耗时间,算法题&nbsp;2&nbsp;道中等&nbsp;+&nbsp;2&nbsp;道&nbsp;Hard,几乎没有送分题,对做题速度和心态都是极致的考验,很多人行测就耗掉了一大半时间,算法题根本没时间写。真实体感:秋招做字节的后端笔试,行测就做了&nbsp;50&nbsp;分钟,剩下的时间&nbsp;4&nbsp;道算法题,只&nbsp;AC&nbsp;了&nbsp;1&nbsp;道半,身边很多同学都是全程被按在地上摩擦,能&nbsp;AC3&nbsp;道以上的,都能被称为大神。5.&nbsp;六大行总行&nbsp;/&nbsp;政策性银行&nbsp;科技岗笔试非技术岗里的地狱难度,难在离谱的题量和无所不包的考点。难在哪里:和互联网公司完全不同,不只是考编程,考点覆盖行测、英语、计算机专业知识(计算机网络、操作系统、数据库、组成原理、C++/Java)、金融知识、时政、常识,甚至还有性格测试,题量能到&nbsp;200&nbsp;多道,考试时间&nbsp;3&nbsp;个小时,全程手不停,做到最后眼睛都花了。真实体感:做某国有大行总行的科技岗笔试,3&nbsp;个小时,200&nbsp;多道题,英语还有&nbsp;10&nbsp;道完形填空&nbsp;+&nbsp;5&nbsp;篇阅读理解,计算机专业知识考得又偏又细,做到最后手都酸了,连蒙带猜才勉强做完,考完直接脑子一片空白。最后想跟牛友们说,笔试只是秋招的一关,哪怕考崩了也不用自我否定,很多笔试的通过率本来就极低,不是你不够优秀。
你做过最难的笔试是哪家公...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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