灵犀互娱笔试 灵犀互娱笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

