- 0
- 0
- 约4.3千字
- 约 14页
- 2026-03-06 发布于福建
- 举报
第PAGE页共NUMPAGES页
2026年微软件工程师面试问题及参考答案
一、编程题(共5题,每题15分,总分75分)
题目1(15分):字符串反转
问题描述:实现一个函数,接收一个字符串作为输入,返回该字符串的反转版本。不能使用内置的反转函数,要求原地修改字符串(如果语言支持)。
示例:
输入:hello
输出:olleh
参考答案:
python
defreverse_string(s:str)-str:
将字符串转换为列表(因为字符串不可变)
s_list=list(s)
left,right=0,len(s_list)-1
双指针交换字符
whileleftright:
s_list[left],s_list[right]=s_list[right],s_list[left]
left+=1
right-=1
将列表转换回字符串
return.join(s_list)
解析:
1.字符串在Python中是不可变的,因此首先将字符串转换为列表
2.使用双指针技术,一个从左侧开始,一个从右侧开始,交换两个指针指向的字符
3.重复上述过程直到两个指针相遇
4.最后将列表重新转换为字符串
这种方法的时间复杂度是O(n),空间复杂度取决于语言是否支持原地修改(Python中需要O(n)额外空间)。
题目2(15分):合并有序数组
问题描述:给定两个已排序的整数数组nums1和nums2,合并这两个数组,使得nums1包含所有元素,并保持有序。nums1有足够的空间容纳nums2中的所有元素。要求尽可能减少操作次数。
示例:
输入:nums1=[1,2,3,0,0,0],nums2=[2,5,6]
输出:[1,2,2,3,5,6]
参考答案:
python
defmerge(nums1,m,nums2,n):
初始化指针
p1,p2,p=m-1,n-1,m+n-1
从后向前合并
whilep1=0andp2=0:
ifnums1[p1]nums2[p2]:
nums1[p]=nums1[p1]
p1-=1
else:
nums1[p]=nums2[p2]
p2-=1
p-=1
复制nums2剩余元素
nums1[:p2+1]=nums2[:p2+1]
解析:
1.采用从后向前的合并方式,可以避免覆盖nums1中的元素
2.初始化三个指针:p1指向nums1的有效元素最后位置,p2指向nums2的有效元素最后位置,p指向nums1的合并后最后位置
3.比较两个数组当前指针的元素,将较大元素放入nums1的合并位置,并移动相应指针
4.当一个数组元素全部合并后,将另一个数组剩余元素直接复制过来
这种方法的时间复杂度是O(m+n),空间复杂度是O(1)。
题目3(15分):有效括号
问题描述:给定一个字符串,包含(,),{,},[和],判断字符串是否有效。有效括号需要满足:
-左括号必须用相同类型的右括号闭合
-左括号必须在右括号之前闭合
-括号必须正确嵌套
示例:
输入:()[]{}
输出:True
输入:([)]
输出:False
参考答案:
python
defisValid(s:str)-bool:
使用栈来匹配括号
stack=[]
字典映射括号对
mapping={(:),{:},[:]}
forcharins:
ifcharinmapping:
stack.append(char)
else:
如果栈为空或栈顶括号不匹配
ifnotstackormapping[stack.pop()]!=char:
returnFalse
如果栈为空,则所有括号匹配
returnnotstack
解析:
1.使用栈数据结构来处理括号匹配问题
2.遍历字符串中的每个字符:
-如果是左括号,压入栈中
-如果是右括号,检查栈是否为空以及栈顶括号是否与当前括号匹配
3.最后检查栈是否为空,为空则所有括号匹配,否则不匹配
这种方法的时间复杂度是O(n),空间复杂度是O(n)。
题目4(15分):最长连续递增序列
问题描述:给定一个整数数组,返回数组中最长连续递增序列的长度。
示例:
输入:[1,3,5,4,7]
输出:3
解释:最长递增子序列是[1,3,5],长度为3
参考答案:
python
deffindLengthOfLCIS(nums):
ifnotnums:
return0
max_len=1
current_len=1
foriinrange(1,len(nums))
原创力文档

文档评论(0)