阿里淘天笔试 阿里淘天笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

点赞 评论 收藏
分享
03-26 22:27
已编辑
中南大学 Java
点赞 评论 收藏
分享
评论
4
13
分享

创作者周榜

更多
牛客网
牛客企业服务