2023 阿里淘天笔试题 阿里笔试 0920
笔试时间:2023年9月20日 秋招
第一题
题目:小红的子数组权值
小红拿到了一个数组。她定义一个连续子数组的权值为: 子数组内不同元素的个数。小红想知道,权值分别为1,2,3,...,n的子数组数量
有多少个?
输入描述
第一行输入一个正整数,代表数组的元素数量;
第二行输入n个正整数a;,代表小红拿到的数组。
1 <= n, ai <= 2000
输出描述
n个整数,分别代表权值为1,2,3,...,n的子数组数量。
样例输入
4
1 2 2 3
样例输出
5 4 1 0
参考题解
模拟,枚举每个元素作为起点,从右插入到set中。直接用一个集合进行模拟即可,最后对集合的大小进行统计。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <unordered_set> using namespace std; typedef long long ll; const int N = 2004; int counts[N]; int numbers[N]; int n; int main() { unordered_set<int> uniqueNumbers; cin >> n; for (int i = 1; i <= n; i++) { cin >> numbers[i]; } for (int i = 1; i <= n; i++) { uniqueNumbers.clear(); for (int j = i; j <= n; j++) { uniqueNumbers.insert(numbers[j]); counts[uniqueNumbers.size()]++; } } for (int i = 1; i <= n; i++) { cout << counts[i] << (i == n ? "\n" : " "); } }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.HashSet; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = 2004; int[] counts = new int[N]; int[] numbers = new int[N]; int n = scanner.nextInt(); for (int i = 1; i <= n; i++) { numbers[i] = scanner.nextInt(); } for (int i = 1; i <= n; i++) { HashSet<Integer> uniqueNumbers = new HashSet<>(); for (int j = i; j <= n; j++) { uniqueNumbers.add(numbers[j]); counts[uniqueNumbers.size()]++; } } for (int i = 1; i <= n; i++) { System.out.print(counts[i]); if (i == n) { System.out.println(); } else { System.out.print(" "); } } } }
Python:[此代码未进行大量数据的测试,仅供参考]
N = 2004 counts = [0] * N numbers = [0] * N n = int(input()) numbers[1:n+1] = map(int, input().split()) for i in range(1, n + 1): uniqueNumbers = set() for j in range(i, n + 1): uniqueNumbers.add(numbers[j]) counts[len(uniqueNumbers)] += 1 for i in range(1, n + 1): print(counts[i], end=" \n"[i == n])
第二题
题目:平均数大于k的最长子序列
给定n个正整数组成的数组,求平均数大于k的最长子序列的长度。
输入描述
第一行输入两个正整数n和k,用空格隔开;
第二行输入n个正整数ai,用来表示数组。
1 <= n <=
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023 秋招笔试题汇总解析 文章被收录于专栏
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。