2026年阿里云程序员面试经典题目解答.docxVIP

  • 0
  • 0
  • 约8.16千字
  • 约 23页
  • 2026-02-11 发布于福建
  • 举报

2026年阿里云程序员面试经典题目解答.docx

第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)

1亿VIP精品文档

相关文档