- 0
- 0
- 约6.6千字
- 约 20页
- 2026-01-29 发布于福建
- 举报
第PAGE页共NUMPAGES页
2026年软件工程师面试宝典:面试题详解与答案
一、编程语言基础(5题,每题6分,共30分)
1.题目:
在Python中,编写一个函数`merge_lists`,该函数接收两个已排序的列表`list1`和`list2`,返回一个新的已排序合并后的列表。要求不使用内置的`sorted()`或`merge()`函数。
答案:
python
defmerge_lists(list1,list2):
merged=[]
i,j=0,0
whileilen(list1)andjlen(list2):
iflist1[i]list2[j]:
merged.append(list1[i])
i+=1
else:
merged.append(list2[j])
j+=1
merged.extend(list1[i:])
merged.extend(list2[j:])
returnmerged
解析:
通过双指针遍历两个列表,逐个比较并按顺序添加到新列表中。时间复杂度为O(n+m),空间复杂度为O(n+m)。
2.题目:
在Java中,解释`String`和`StringBuilder`的区别,并说明在什么场景下优先使用`StringBuilder`。
答案:
`String`是不可变的(immutable),每次修改都会生成新的对象;`StringBuilder`是可变的(mutable),内部维护一个字符数组,修改时直接在原数组上操作。优先使用`StringBuilder`的场景包括:
-字符串频繁拼接(如循环中)
-需要动态修改字符串内容(如JSON处理)
解析:
`String`的不可变性导致高并发场景下性能损耗较大,而`StringBuilder`适合需要频繁修改字符串的场景。
3.题目:
在C++中,编写一个函数`reverse_string`,将输入的字符串反转,不使用标准库函数。
答案:
cpp
includeiostream
includestring
usingnamespacestd;
voidreverse_string(strings){
intleft=0,right=s.size()-1;
while(leftright){
swap(s[left],s[right]);
left++;
right--;
}
}
解析:
通过双指针从两端向中间交换字符,时间复杂度为O(n),空间复杂度为O(1)。
4.题目:
在JavaScript中,解释`let`和`var`的区别,并说明`const`的作用。
答案:
-`let`:块级作用域(block-scoped),支持`for...of`循环
-`var`:函数作用域(function-scoped),存在变量提升
-`const`:声明不可变变量,初始化后不可重新赋值
解析:
`let`和`const`是ES6的改进,避免了`var`的常见坑(如`for`循环中的变量泄露)。
5.题目:
在Go中,编写一个函数`count_vowels`,统计字符串中元音字母(a,e,i,o,u)的数量。
答案:
go
funccount_vowels(sstring)int{
vowels:=aeiou
count:=0
for_,char:=ranges{
ifstrings.ContainsRune(vowels,char){
count++
}
}
returncount
}
解析:
遍历字符串中的每个字符,判断是否属于元音字母集合。时间复杂度为O(n)。
二、数据结构与算法(8题,每题7分,共56分)
1.题目:
解释二叉搜索树(BST)的性质,并编写一个函数判断给定二叉树是否为BST。
答案:
BST性质:
-左子树所有节点根节点
-右子树所有节点根节点
-左右子树均为BST
python
classTreeNode:
def__init__(self,val=0,left=None,right=None):
self.val=val
self.left=left
self.right=right
defis_bst(root):
defvalidate(node,low=float(-inf),high=float(inf)):
ifnotnode:
returnTrue
ifnot(lownode.valhigh):
returnFalse
returnvalidate(node.left,low,
原创力文档

文档评论(0)