迅雷笔试 迅雷笔试题 0925

笔试时间:2024年09月25日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目

给出一个整数数组,元素大小范围区间都在[-10,10]之间。可以有三次机会将数组中的一个数替换成任意数,请算出可能的最长相等子段数列的长度。

输入描述

输入一行元素,用空格分割

元素大小范围区间都在[-10,10]之间。

输出描述

输出一个整数x,表示可能的最长相等子段数列的长度。

补充说明:

时间复杂度O(n)

空间复杂度O(1)

数组的长度为1<= n <= 10^5

第一个示例中,可以将数组变成[0,0,0,0,0,3]或者[0,3,3,3,3,3],结果都是5

样例输入一

0 3 1 0 6 3

样例输出一

5

样例输入二

1 2

样例输出二

2

参考题解

计数频率:统计每个数字出现的次数。计算最长相等子段:使用滑动窗口,通过频率数组找出最多能形成的相等子段长度。替换:使用当前数字的频率和当前窗口大小来决定是否能通过替换达到更长的相等子段。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

int maxEqualSegmentLength(const vector<int>& nums) {
    int max_count = 0;
    int left = 0;
    int right = 0;
    int replace_count = 3;
    unordered_map<int, int> count_map;

    while (right < nums.size()) {
        count_map[nums[right]]++;
        max_count = max(max_count, count_map[nums[right]]);

        while ((right - left + 1) - max_count > replace_count) {
            count_map[nums[left]]--;
            if (count_map[nums[left]] == 0) {
                count_map.erase(nums[left]);
            }
            left++;
        }

        right++;
    }

    return right - left;
}

int main() {
    string input_line;
    getline(cin, input_line);

    if (input_line.empty()) {
        cout << 0 << endl;
        return 0;
    }

    vector<int> nums;
    istringstream iss(input_line);
    int num;
    while (iss >> num) {
        nums.push_back(num);
    }

    cout << maxEqualSegmentLength(nums) << endl;

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class MaxEqualSegmentLength {

    public static int maxEqualSegmentLength(int[] nums) {
        int maxCount = 0;
        int left = 0;
        int right = 0;
        int replaceCount = 3;
        Map<Integer, Integer> countMap = new HashMap<>();

        while (right < nums.length) {
            countMap.put(nums[right], countMap.getOrDefault(nums[right], 0) + 1);
            maxCount = Math.max(maxCount, countMap.get(nums[right]));

            while ((right - left + 1) - maxCount > replaceCount) {
                countMap.put(nums[left], countMap.get(nums[left]) - 1);
                if (countMap.get(nums[left]) == 0) {
                    countMap.remove(nums[left]);
                }
                left++;
            }

            right++;
        }

        return right - left;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String inputLine = scanner.nextLine().trim();

        if (inputLine.isEmpty()) {
            System.out.println(0);
            return;
        }

        String[] inputArray = inputLine.split(" ");
        int[] nums = new int[inputArray.length];
        for (int i = 0; i < inputArray.length; i++) {
            nums[i] = Integer.parseInt(inputArray[i]);
        }

        System.out.println(maxEqualSegmentLength(nums));
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

def max_equal_segment_length(nums):
    max_count = 0
    left = 0
    right = 0
    replace_count = 3 
    count_map = {}

    while right < len(nums):
        count_map[nums[right]] = count_map.get(nums[right], 0) + 1
        max_count = max(max_count, count_map[nums[right]])

        while (right - left + 1) - max_count > replace_count:
            count_map[nums[left]] -= 1
            if count_map[nums[left]] == 0:
                del count_map[nums[left]]
            left += 1

        right += 1

    return right - left


def main():
    input_line = input().strip()

    if not input_line:
        print(0)
        return

        nums = list(map(int, input_line.split()))

    print(max_equal_segment_length(nums))


if __name__ == "__main__":
    main()

第二题

题目

在文本处理系统中,我们经常需要对文本进行一系列的转换操作。现在,系统接收到了两个字符串 str1 和 str2,它们代表了转换前后的文本状态。系统的任务是验证是否可以通过一系列特定的字符映射操作,将 str1转换成 str2。每一次映射操作,系统可以将 st1中出现的所有相同字母替换成其他任何小写英文字母。系统需要确保这种转换是可能的,并且在满足时间复杂度和空间复杂度的要求下完成验证。

输入描述

输入一行两个字符串str1,str2,用空格分割,表示需要被转换的字符串和转换的目标字符串。

输出描述

输出一个字符串表示转化结果,true 表示能够转化,fasle表示不能转化。

补充说明:

时间复杂度:O(n),其中n是字符串 str1 或 str2 的长度

空间复杂度:O(k),其中k是 str1 和 str2 中最大不同字符的数遢

字符串长度:1<=str1.length == str2.length <= 10^4

字符范围:str1 和 str2 中都只会出现小写英文字母

样例输入一

aabcc ccdee

样例输出一

true

说明:

1.系统可以通过以下映射操作将 str1 转换为 str2:

。将'a'映射为’c’

。将'b'映射为’d’

。将'c'映射为‘e‘

样例输入二

aabcc ccdda

样例输出二

false

说明:

系统无法通过映射操作将 str1 转换为 str2,因为 str1 中的"CC"无法转换成str2 中的“da”。

参考题解

映射数组:定义一个大小为 26 的整型数组 c,用来存储字符的映射关系。数组的每个元素初始化为 -1,表示尚未映射任何字符。遍历:通过循环遍历字符串的每个字符:检查当前字符 a[i] 是否已经有对应的映射。如果没有(c[ai] == -1),则将其映射到字符 b[i]。如果已经有映射,检查该映射是否一致。如果不一致,输出 false 并结束程序。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::string a, b;
    std::ci

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

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

目前大二,中流211,这个简历能找到实习嘛?想知道八股要背到什么程度能开始投简历呢tot能投大厂吗
牛客44176770...:兄弟,先不急着找大厂实习吧,真的😭面试问的挺深的,会表面八股根本行不通,你的项目人家都没心情问😭小厂实习可以去吧,我就是有个小厂实习才有一个且仅有一个约面机会。而且,一开始就先问算法题,然后是八股MySQLRedis这些。你平时看这些,以为自己会了,但是在面试中问你,对于MySQL你了解多少,你能在面试中有逻辑的回答出来吗?而且,你大二,人家对你的项目根本不感兴趣,只问你基础。唉今天刚结束百度一面,我这几天都重点复盘了做过的项目,结果根本不问,问就问一个lua脚本怎么写。😭真的兄弟,咱不是天才,真得一步一步来,扎实基础😔😔
点赞 评论 收藏
分享
最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
2025-12-10 19:36
湖北工业大学 Web前端
饿魔:看到在线简历了吧
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

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