- 0
- 0
- 约8.16千字
- 约 23页
- 2026-02-11 发布于福建
- 举报
第PAGE页共NUMPAGES页
2026年阿里云程序员面试经典题目解答
一、编程基础题(共5题,每题10分,总分50分)
题目1(10分)
问题描述:请实现一个函数,输入一个整数数组,返回该数组所有子数组的中位数之和。例如,输入数组[1,3,2,4],其所有子数组的中位数分别为1,1.5(3和2的平均值),2,3,2,2.5(4和3的平均值),4,3,2.5,2,2,1.5,1,所以函数应返回28.5。
要求:时间复杂度不超过O(n^2),空间复杂度不超过O(n)。
答案:
java
importjava.util.TreeMap;
publicclassSubarrayMedianSum{
publicdoublesubarrayMedianSum(int[]nums){
intn=nums.length;
doublesum=0;
TreeMapInteger,Integermap=newTreeMap();
map.put(0,1);//初始化哨兵
intprefixSum=0;
for(inti=0;in;i++){
prefixSum+=nums[i];
//找到小于等于prefixSum的中位数位置
Map.EntryInteger,Integerentry=map.floorEntry(prefixSum);
intcount=entry.getValue();
//计算当前元素对中位数和的贡献
doublemedianContribution=count(prefixSum-entry.getKey())+
(prefixSum-entry.getKey()-count1)
(prefixSum-entry.getKey()-count);
sum+=medianContribution/2;
//更新map
map.put(prefixSum,count+1);
}
returnsum;
}
//测试用例
publicstaticvoidmain(String[]args){
SubarrayMedianSumsolution=newSubarrayMedianSum();
int[]nums={1,3,2,4};
System.out.println(solution.subarrayMedianSum(nums));//输出28.5
}
}
解析:
1.使用前缀和与平衡树结合的方法
2.前缀和数组prefixSum[i]表示从nums[0]到nums[i-1]的和
3.对于每个前缀和prefixSum[i],我们需要找到小于等于它的前缀和的数量count
4.这样可以通过组合数学计算当前元素对中位数和的贡献
5.时间复杂度:O(nlogn)主要来自map操作,空间复杂度:O(n)用于存储前缀和
题目2(10分)
问题描述:实现一个函数,给定一个正整数n,返回所有小于等于n的素数的列表。要求不使用埃拉托斯特尼筛法,时间复杂度尽可能低。
答案:
python
defsieve_of_eratosthenes(n):
ifn2:
return[]
is_prime=[True](n+1)
is_prime[0]=is_prime[1]=False
foriinrange(2,int(n0.5)+1):
ifis_prime[i]:
forjinrange(ii,n+1,i):
is_prime[j]=False
return[ifori,primeinenumerate(is_prime)ifprime]
测试用例
print(sieve_of_eratosthenes(30))#输出[2,3,5,7,11,13,17,19,23,29]
解析:
1.采用埃拉托斯特尼筛法的变种实现
2.时间复杂度:O(nloglogn)是已知的最优算法之一
3.空间复杂度:O(n)用于存储素数标记
4.该算法通过标记非素数的方式来找出所有素数
5.对于每个素数i,将其所有倍数j(ii,n+1,i)标记为非素数
题目3(10分)
问题描述:给定一个字符串s,找到其中最长的不含重复字符的子串长度。例如,输入abcabcbb,返回3(abc)。
答案:
python
deflength_of_longest_substring(s):
char_set=set()
left=0
m
原创力文档

文档评论(0)