2023 蚂蚁笔试题 0420
笔试时间:2023年4月20日 春招实习
第一题
小红拿到了一个数组,她可以进行一次操作:选择两个相邻元素将它们合井,合并后的新元素为原来的两个元素之和。小红想知道,操作一次后数组的极差的最小值是多少?(数组的极差为:数组的最大值减最小值)
输入描述
第二行输入n个正整数ai,代表数组的元素。
2<=n<10^5
1<ai<10^9
输出描述
一个整数,代表操作后的极差最小值。
样例输入
3
1 4 5
样例输出
0
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
vector<int> pre_max(n);
vector<int> pre_min(n);
vector<int> suf_max(n);
vector<int> suf_min(n);
auto get_max = [&](int i) {
int ret = a[i] + a[i + 1];
if (i + 2 < n) {
ret = max(ret, suf_max[i + 2]);
}
if (i - 1 >= 0) {
ret = max(ret, pre_max[i - 1]);
}
return ret;
};
auto get_min = [&](int i) {
int ret = a[i] + a[i + 1];
if (i + 2 < n) {
ret = min(ret, suf_min[i + 2]);
}
if (i - 1 >= 0) {
ret = min(ret, pre_min[i - 1]);
}
return ret;
};
pre_max[0] = pre_min[0] = a[0];
for (int i = 1; i < n; i++) {
pre_max[i] = max(pre_max[i - 1], a[i]);
pre_min[i] = min(pre_min[i - 1], a[i]);
}
suf_max[n - 1] = suf_min[n - 1] = a[n - 1];
for (int i = n - 2; i >= 0; i--) {
suf_max[i] = max(suf_max[i + 1], a[i]);
suf_min[i] = min(suf_min[i + 1], a[i]);
}
int ans = INT_MAX;
for (int i = 0; i < n - 1; i++) {
int mx = get_max(i);
int mi = get_min(i);
ans = min(ans, mx - mi);
}
cout << ans << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n];
int[] pre_max = new int[n];
int[] pre_min = new int[n];
int[] suf_max = new int[n];
int[] suf_min = new int[n];
for (int i = 0; i < n; ++i) {
a[i] = scanner.nextInt();
}
for (int i = 0; i < n; ++i) {
pre_max[i] = pre_min[i] = a[i];
}
for (int i = 1; i < n; ++i) {
pre_max[i] = Math.max(pre_max[i - 1], a[i]);
pre_min[i] = Math.min(pre_min[i - 1], a[i]);
}
suf_max[n - 1] = suf_min[n - 1] = a[n - 1];
for (int i = n - 2; i >= 0; --i) {
suf_max[i] = Math.max(suf_max[i + 1], a[i]);
suf_min[i] = Math.min(suf_min[i + 1], a[i]);
}
int ans = Integer.MAX_VALUE;
for (int i = 0; i < n - 1; ++i) {
int mx = get_max(a, pre_max, suf_max, i);
int mi = get_mi
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023 秋招笔试题汇总解析 文章被收录于专栏
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。
