2023 阿里云笔试题 算法岗 阿里笔试 0917
笔试时间:2023年9月17日 秋招
第一题
题目:城市人口
某个国家有n个城市,第i个城市的人口为ai人,如果某个城市的人口不超过其他任间一个城市人口的两倍,那么这是一个稳定的城市。国家可以对城市执行政策从而改变城市人口的数量,最少需要对几个城市执行政策,才能使得所有的城市都变得稳定。
输入描述
第一行一个整数n,表示城市的数量;
接下来一行n个整数,第i个整数表示第个城市的人口ai。
1 <= n <= 10^5
1 <= ai <= 10^9
输出描述
输出一个整数,表示最少需要修改的城市数量。
样例输入
4
1 2 3 4
样例输出
1
提示:将第一个数修改为2即可。
参考题解
贪心 + 双指针。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <algorithm>
const int MaxSize = 100004;
int numbers[MaxSize];
int n;
int main() {
std::cin >> n;
for (int i = 1; i <= n; i++) {
std::cin >> numbers[i];
}
std::sort(numbers + 1, numbers + n + 1);
int minOperations = n;
for (int left = 1, right = 1; left <= n; left++) {
for (; right <= n && numbers[right] <= numbers[left] * 2; right++);
minOperations = std::min(minOperations, (left - 1) + (n + 1 - right));
}
std::cout << minOperations << std::endl;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] numbers = new int[n];
for (int i = 0; i < n; i++) {
numbers[i] = input.nextInt();
}
Arrays.sort(numbers);
int minOperations = n;
for (int left = 0, right = 0; left < n; left++) {
while (right < n && numbers[right] <= numbers[left] * 2) {
right++;
}
minOperations = Math.min(minOperations, (left) + (n - right));
}
System.out.println(minOperations);
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
n = int(input())
numbers = list(map(int, input().split()))
numbers.sort()
min_operations = n
left = 0
right = 0
while left < n:
while right < n and numbers[right] <= numbers[left] * 2:
right += 1
min_operations = min(min_operations, left + (n - right))
left += 1
print(min_operations)
第二题
题目:小红选点
坐标轴上有n个点,小红希望选出其中m个点,并且这m个点两两之间距离都不超过K,求有多少种选点方案?
输入描述
一行三个整数 n,m,k,表示点的个数,选点的个数,以及两两之间距离不超过k;
接下来一行n个整数xi,表示每个点的坐标。
2 <= m <= 4
m <= n <= 10^5
1 <= xi, k <= 10^9
输出描述
输出一个整数,表示方案数,由于答案可能很大,输出答案对10^9 + 7取模的结果。
样例输入
示例一:
4 2 3
1 2 3 4
示例二:
4 2 2
1 2 3 4
样例输出
示例一:
6
提示:任选两个点都可以满足条件。
示例二:
5
参考题解
使用双指针法枚举一段可以任意取的节点,其中固定必取左端点。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <algorithm>
typedef long long ll;
const int MaxSize = 100004;
const int MaxM = 5;
const ll Mod = 1000000007;
ll Combinations[MaxSize][MaxM];
std::vector<int> numbers;
int main() {
int n, m, k;
std::cin >> n >> m >> k;
for (int i = 0; i <= n; i++) {
Combinations[i][0] = 1;
if (i < MaxM) {
Combinations[i][i] = 1;
}
for (int j = 1; j < i && j < m; j++) {
Combinations[i][j] = (Combinations[i - 1][j - 1] + Combinations[i - 1][j]) % Mod;
}
}
numbers.resize(n + 1);
for (int i = 1; i <= n; i++) {
std::cin >> numbers[i];
}
std::sort(numbers.begin() + 1, numbers.end());
ll ans = 0;
for (int left = 1, right = 1; left <= n; left++) {
while (right <= n && numbers[right] - numbers[left] <= k) {
right++;
}
ans = (ans + Combinations[right - left - 1][m - 1]) % Mod;
}
std::cout << ans << std::endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int m = input.nextInt();
int k = input.nextInt();
long[][] Combinations = new long[n + 1][m + 1];
long Mod = 1000000007;
fo
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。
