- 0
- 0
- 约7.26千字
- 约 20页
- 2026-01-19 发布于福建
- 举报
第PAGE页共NUMPAGES页
2026年中国南方航空软件开发工程师面试题
一、编程语言与数据结构(5题,每题10分,共50分)
1.题目:
编写一个函数,实现快速排序算法,并分析其时间复杂度和空间复杂度。假设输入为一个包含重复元素的整数数组,要求输出排序后的数组。
答案与解析:
答案:
python
defquick_sort(arr):
iflen(arr)=1:
returnarr
pivot=arr[len(arr)//2]
left=[xforxinarrifxpivot]
middle=[xforxinarrifx==pivot]
right=[xforxinarrifxpivot]
returnquick_sort(left)+middle+quick_sort(right)
示例输入
arr=[3,6,8,10,1,2,1]
print(quick_sort(arr))
解析:
快速排序是一种分治算法,通过选择一个基准值(pivot),将数组分为三部分:小于基准值的、等于基准值的、大于基准值的。然后递归地对小于和大于基准值的部分进行排序。
-时间复杂度:
-最好情况:O(nlogn),每次分区都能均匀分割数组。
-平均情况:O(nlogn),分区基本均匀。
-最坏情况:O(n2),每次分区只能减少一个元素(如已排序数组选择最左或最右为基准)。
-空间复杂度:O(logn),递归调用栈的深度。
2.题目:
给定一个无重复元素的整数数组,编写一个函数,返回所有可能的子集(包括空集)。要求不使用递归,使用迭代方法实现。
答案与解析:
答案:
python
defsubsets(nums):
res=[[]]
fornuminnums:
res+=[curr+[num]forcurrinres]
returnres
示例输入
nums=[1,2,3]
print(subsets(nums))
解析:
迭代方法通过逐个添加元素,扩展现有子集。初始时只有空集,每次添加一个新元素时,将其与所有现有子集组合,形成新的子集。
-时间复杂度:O(2^n),共有2^n个子集。
-空间复杂度:O(2^n),存储所有子集。
3.题目:
定义一个单链表节点类,并实现一个函数,判断链表是否存在环。要求不使用额外空间,使用快慢指针方法实现。
答案与解析:
答案:
python
classListNode:
def__init__(self,val=0,next=None):
self.val=val
self.next=next
defhasCycle(head):
slow=head
fast=head
whilefastandfast.next:
slow=slow.next
fast=fast.next.next
ifslow==fast:
returnTrue
returnFalse
示例输入
head=ListNode(3)
head.next=ListNode(2)
head.next.next=ListNode(0)
head.next.next.next=head#创建环
print(hasCycle(head))
解析:
快慢指针法:慢指针每次移动一步,快指针每次移动两步。如果链表有环,快指针最终会追上慢指针;否则快指针会到达链表末尾。
-时间复杂度:O(n),最多遍历n次。
-空间复杂度:O(1),不使用额外空间。
4.题目:
编写一个函数,实现字符串的KMP(Knuth-Morris-Pratt)算法,用于查找子串在主串中的位置。要求不使用库函数,手动实现。
答案与解析:
答案:
python
defkmp_search(text,pattern):
defcompute_lps(pattern):
lps=[0]len(pattern)
length=0
i=1
whileilen(pattern):
ifpattern[i]==pattern[length]:
length+=1
lps[i]=length
i+=1
else:
iflength!=0:
length=lps[length-1]
else:
lps[i]=0
i+=1
returnlps
lps=compute_lps(pattern)
i=j=0
whileilen(text):
ifpa
原创力文档

文档评论(0)