2026年微软件工程师面试全攻略及答案详解.docxVIP

  • 0
  • 0
  • 约6.24千字
  • 约 18页
  • 2026-01-21 发布于福建
  • 举报

2026年微软件工程师面试全攻略及答案详解.docx

第PAGE页共NUMPAGES页

2026年微软件工程师面试全攻略及答案详解

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

1.题目:

给定一个非负整数`n`,编写一个函数,返回`n`的二进制表示中`1`的个数。例如,输入`n=11`(二进制为`1011`),输出`3`。

答案:

cpp

intcountBits(intn){

intcount=0;

while(n){

count+=n1;

n=1;

}

returncount;

}

解析:

使用位运算,每次将`n`右移一位,并统计最低位的`1`的数量。时间复杂度O(logn),空间复杂度O(1)。

2.题目:

实现一个函数`reverseWords`,将输入的字符串`s`中的单词顺序反转,但每个单词内部的字符顺序不变。例如,输入`theskyisblue`,输出`blueisskythe`。

答案:

cpp

stringreverseWords(strings){

vectorstringwords;

stringword;

for(charc:s){

if(c==){

if(!word.empty()){

words.push_back(word);

word.clear();

}

}else{

word+=c;

}

}

if(!word.empty())words.push_back(word);

stringresult;

for(inti=words.size()-1;i=0;--i){

result+=words[i];

if(i!=0)result+=;

}

returnresult;

}

解析:

先按空格分割字符串,将单词存入向量中,然后按倒序拼接。时间复杂度O(n),空间复杂度O(n)。

3.题目:

给定一个字符串`s`,判断它是否是回文串。假设只包含字母和数字,忽略大小写。例如,输入`Aman,aplan,acanal:Panama`,输出`true`。

答案:

cpp

boolisPalindrome(strings){

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

while(leftright){

while(leftright!isalnum(s[left]))left++;

while(leftright!isalnum(s[right]))right--;

if(tolower(s[left])!=tolower(s[right]))returnfalse;

left++;

right--;

}

returntrue;

}

解析:

双指针法,忽略非字母数字字符,并比较对应位置的字符是否相等。时间复杂度O(n),空间复杂度O(1)。

4.题目:

实现一个函数`merge`,将两个有序数组`nums1`和`nums2`合并成一个新的有序数组。假设`nums1`的空间足够容纳`nums2`的元素。例如,输入`nums1=[1,2,3]`,`nums2=[2,5,6]`,输出`[1,2,2,3,5,6]`。

答案:

cpp

voidmerge(vectorintnums1,intm,vectorintnums2,intn){

intp1=m-1,p2=n-1,p=m+n-1;

while(p1=0p2=0){

nums1[p--]=(nums1[p1]nums2[p2])?nums1[p1--]:nums2[p2--];

}

while(p2=0){

nums1[p--]=nums2[p2--];

}

}

解析:

从后向前合并,避免覆盖`nums1`的元素。时间复杂度O(m+n),空间复杂度O(1)。

5.题目:

给定一个链表,删除链表的倒数第`n`个节点,并返回新链表的头节点。例如,输入`head=[1,2,3,4,5]`,`n=2`,输出`[1,2,3,5]`。

答案:

cpp

ListNoderemoveNthFromEnd(ListNodehead,intn){

ListNodedummy=newListNode(0);

dummy-next=head;

ListNodefast=dummy,slow=dummy;

for(inti=0;in;++i

文档评论(0)

1亿VIP精品文档

相关文档