灵犀互娱笔试 灵犀互娱笔试题 0824

笔试时间:2024年08月24日 秋招 阿里灵犀互娱

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

第一题

题目:减一

给出一组数,求出最长的子串。使得这个子串中的数最大值和最小值的差值最大为1。 如1 5 4 1 2 4 2 5 5。最长子串为5 4 4 5 5,长度为5。

输入描述

第一行为一整数n(1<=n<=100),表示整数的个数。 

下一行为n个整数,以空格分割,每个整数的值小于10^9。

输出描述

输出一个整数,为最长子串长度。

样例输入

6

4 6 5 3 3 1

样例输出

3

参考题解

模拟。

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

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

using namespace std;

int max_length_subarray(vector<int>& arr) {
    if (arr.empty()) {
        return 0;
    }

    sort(arr.begin(), arr.end());
    int start = 0;
    int max_length = 1;

    for (int end = 1; end < arr.size(); ++end) {
        if (arr[end] - arr[start] > 1) {
            ++start;
        }
        max_length = max(max_length, end - start + 1);
    }

    return max_length;
}

int main() {
    int n;
    cin >> n;

    vector<int> nums(n);
    for (int i = 0; i < n; ++i) {
        cin >> nums[i];
    }

    cout << max_length_subarray(nums) << endl;

    return 0;
}

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

import java.util.*;

public class Main {
    public static int maxLengthSubarray(List<Integer> arr) {
        if (arr.isEmpty()) {
            return 0;
        }

        Collections.sort(arr);
        int start = 0;
        int maxLength = 1;

        for (int end = 1; end < arr.size(); ++end) {
            if (arr.get(end) - arr.get(start) > 1) {
                ++start;
            }
            maxLength = Math.max(maxLength, end - start + 1);
        }

        return maxLength;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        List<Integer> nums = new ArrayList<>(n);

        for (int i = 0; i < n; ++i) {
            nums.add(scanner.nextInt());
        }

        System.out.println(maxLengthSubarray(nums));
        scanner.close();
    }
}

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

n = int(input())
nums = list(map(int, input().split()))

def max_length_subarray(arr):
    if not arr:
        return 0
    
    arr.sort()  
    start = 0
    max_length = 1
    
    for end in range(1, len(arr)):
        if arr[end] - arr[start] > 1:
            start += 1
        max_length = max(max_length, end - start + 1)
    
    return max_length

print(max_length_subarray(nums))

第二题

题目:小杰的灵犀之旅

小杰在异世界探险时发现了一个有着奇妙法则的地方,灵犀帝国。这个法则让灵犀帝国的人不再为食物而烦恼。每逢每个月的最后一天,在灵犀帝国中的人会进入到其对应的奇妙领域,届时会有n轮食物大派送降临。奇妙领域存在着一条m个格子的路,在每轮的食物大派送中会在[l, r]的格子上放一颗灵果。此时小杰已经进入了奇妙领域,如果小杰将n轮食物大派送的所有灵果取走会拥有多少颗灵果呢?

输入描述

第一行包含一个正整数T (T < 10),T代表数据组数。 

接下来T组数据,每组数据第一行两个正整数n,m。

第二行开始有n行,每行两个正整数l,r (1 <= l <= m, l <= r <= m)

输出描述

对于每组输入输出小杰拥有灵果的个数,由于答案可能过大所以答案%998244353。

说明

补充说明对于30%的数据 1 <= n <= 1000, 1 <= m <= 1000 对于50%的数据 1<= n <= 10000, 1 <= m <= 10000 对于100%的数据 1 <= n <= 100000, 1 <= m <= 100000

样例输入

2

1 2

1 2

3 6

1 2

1 2

4 5

样例输出

2

6

参考题解

将题目所给的所有区间累加即可,注意取模。

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

#include <iostream>

using namespace std;

int main() {
    int T;
    cin >> T;

    for (int i = 0; i < T; i++) {
        int n, m;
        cin >> n >> m;
        
        long long res = 0;
        for (int j = 0; j < n; j++) {
            int l, r;
            cin >> l >> r;
            res += r - l + 1;
            res %= 998244353;
        }
        
        cout << res << endl;
    }

    return 0;
}

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

import java.util.Scanner;

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

        for (int i = 0; i < T; i++) {
            int n = scanner.nextInt();
            int m = scanner.nextInt();
            
            long res = 0;
            for (int j = 0; j < n; j++) {
                int l = scanner.nextInt();
                int r = scanner.nextInt();
                res += r - l + 1;
                res %= 998244353;
            }
            
            System.out.println(res);
        }
        
        scanner.close();
    }
}

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

MOD = 998244353

def main():
    T = int(input())
    
    for _ in range(T):
        n, m = map(int, input().split())
        res = 0
        
        for _ in range(n):
            l, r = map(int, input().split())
            res += r - l + 1
            res %= MOD
        
        print(res)

if __name__ ==

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

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

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

全部评论

相关推荐

测试糕手手:社会第一课,随便吹牛逼,直接说四个月,别老实。老实人只会被欺负
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

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