小米软件工程师面试问题及答案.docxVIP

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

第PAGE页共NUMPAGES页

2026年小米软件工程师面试问题及答案

一、编程基础(5题,每题2分,共10分)

1.题目:

请实现一个函数,输入一个正整数`n`,返回`n`的阶乘。要求使用递归和迭代两种方法实现,并比较时间复杂度。

答案:

递归方法:

java

publicstaticlongfactorialRecursive(intn){

if(n=1){

return1;

}

returnnfactorialRecursive(n-1);

}

迭代方法:

java

publicstaticlongfactorialIterative(intn){

longresult=1;

for(inti=2;i=n;i++){

result=i;

}

returnresult;

}

解析:

-递归方法的时间复杂度为`O(n)`,空间复杂度为`O(n)`(因为递归调用栈的深度为`n`)。

-迭代方法的时间复杂度也为`O(n)`,但空间复杂度为`O(1)`(仅使用常量额外空间)。在`n`较大时(如`n1000`),递归方法可能导致栈溢出,而迭代方法更稳定。

2.题目:

请编写一个函数,判断一个字符串是否为回文串(正读和反读相同)。不使用现成的库函数。

答案:

java

publicstaticbooleanisPalindrome(Strings){

intleft=0,right=s.length()-1;

while(leftright){

if(s.charAt(left)!=s.charAt(right)){

returnfalse;

}

left++;

right--;

}

returntrue;

}

解析:

双指针法从字符串两端向中间遍历,逐个字符比较。若所有字符匹配,则为回文串;否则返回`false`。时间复杂度为`O(n)`,空间复杂度为`O(1)`。

3.题目:

请实现快速排序算法,并用示例说明其工作过程。

答案:

java

publicstaticvoidquickSort(int[]arr,intleft,intright){

if(left=right){

return;

}

intpivot=arr[left+(right-left)/2];

intl=left,r=right;

while(l=r){

while(arr[l]pivot)l++;

while(arr[r]pivot)r--;

if(l=r){

swap(arr,l,r);

l++;

r--;

}

}

quickSort(arr,left,r);

quickSort(arr,l,right);

}

publicstaticvoidswap(int[]arr,inti,intj){

inttemp=arr[i];

arr[i]=arr[j];

arr[j]=temp;

}

解析:

快速排序的核心是分治思想:

1.选择一个基准值(pivot),通常取中间值;

2.将数组划分为两部分,左边的元素均小于基准值,右边的元素均大于基准值;

3.递归对左右两部分进行排序。

时间复杂度平均为`O(nlogn)`,最坏为`O(n^2)`(当基准值选择不均匀时)。

4.题目:

请解释什么是“线程池”,并说明其优缺点。

答案:

线程池是一组预先创建并管理的线程集合,用于执行异步任务。主要优点:

-减少线程创建开销:避免频繁创建和销毁线程;

-提高性能:重用线程可减少任务切换时间;

-资源控制:限制并发线程数,防止系统过载。

缺点:

-灵活性低:任务必须适配线程池模式;

-异常处理复杂:未正确关闭线程池可能导致资源泄漏。

5.题目:

请实现一个LRU(LeastRecentlyUsed)缓存,支持`get`和`put`操作。

答案:

java

classLRUCache{

privateMapInteger,Nodemap;

privateNodehead,tail;

privateintcapacity;

classNode{

intkey,value;

Nodeprev,next;

Node(intkey,intvalue){

this.key=key;

this.value=value;

}

}

publicLRUCache(intcapacity){

this.capacity=capacity;

m

文档评论(0)

1亿VIP精品文档

相关文档