灵犀互娱笔试 灵犀互娱笔试题 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多种语言版本,持续更新中。

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务