阿里淘天笔试 阿里淘天笔试题 0403
笔试时间:2024年04月03日
历史笔试传送门:2023秋招笔试合集
第一题
题目:小红的数组访问
小红有一个长度为 n 的数组 a ,她每次会询问区间 [l,r] 中所有数字拼接起来是否是 3 的倍数。
输入描述
第一行输入两个整数 n,q(1<=n,q<=10^5) 表示数组长度和询问次数。
第二行输入 n 个整数表示数组 a(1<=ai<=10^9) 。
接下来的q行,每行输入2个整数,表示询问的 [l,r] 区间。1<=l<=r<=n。
输出描述
对于每个询问输出一行,若区间所有数字拼接起来是 3 的倍数,则输出 "YES" ,否则输出 "NO" 。
样例输入
3 2
11 45 14
1 3
2 2
样例输出
NO
YES
说明
将[1,3]拼接后,数字为114514,不是3的倍数,输出"NO"。将[2,2]拼接后,数字为45,是3的倍数,输出"YES"。
参考题解
前缀和。统计前缀和,判断查询的区间的总和是否为3的倍数即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, q;
cin >> n >> q;
vector<int> A(n);
for (int i = 0; i < n; ++i) {
cin >> A[i];
}
vector<int> pres(n + 1, 0);
for (int i = 1; i <= n; ++i) {
pres[i] = pres[i - 1] + A[i - 1];
}
for (int i = 0; i < q; ++i) {
int l, r;
cin >> l >> r;
if ((pres[r] - pres[l - 1]) % 3 == 0) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int q = sc.nextInt();
int[] A = new int[n];
for (int i = 0; i < n; ++i) {
A[i] = sc.nextInt();
}
int[] pres = new int[n + 1];
for (int i = 1; i <= n; ++i) {
pres[i] = pres[i - 1] + A[i - 1];
}
for (int i = 0; i < q; ++i) {
int l = sc.nextInt();
int r = sc.nextInt();
if ((pres[r] - pres[l - 1]) % 3 == 0) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
sc.close();
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
n,q = map(int, input().split())
A = list(map(int, input().split()))
pres = [0] * (n+1)
for i in range(1, n+1):
pres[i] = pres[i-1] + A[i-1]
for i in range(q):
l,r = map(int, input().split())
if (pres[r] - pres[l-1])%3==0:
print("YES")
else:
print("NO")
第二题
题目:小苯的数组染色
小红给了小苯一个长为 n 的数组 a,初始数组中的每个数字都是白色。小苯可以进行如下两种操作中的一种:
1、任选一个白色的元素,将其染红。
2、选择一个区间[l,r],满足al != ar且区间两个端点元素均为白色。将区间所有元素染红。
小苯想知道他最少几次操作可以将所有数字都染红,请你帮帮他吧。
输入描述
输入包含 2*T+1 行。
第一个一个正整数 T(1<=T<=10^4),表示测试数据组数。
接下来对于每组测试数据,输入包含两行。
第一行一个正整数 n(1<=n<=2*10^5),表示数组 a 的长度。
第二行 n 个正整数 ai(1<=ai<=10^9),表示数组 ai 的元素。
输出描述
输出包含 T 行。
对于每组测试数据,输出包含一行一个正整数,表示染红所有数字的最小操作次数。
样例输入
2
3
1 2 1
2
1 1
样例输出
2
2
参考题解
动态规划。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
vector<int> A(n);
for (int i = 0; i < n; ++i) {
cin >> A[i];
}
if (A[0] != A[n - 1]) {
cout << 1 << endl;
conti
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。
