- 0
- 0
- 约5.23千字
- 约 16页
- 2026-01-05 发布于福建
- 举报
第PAGE页共NUMPAGES页
2026年华为技术研发岗面试题目解析
一、编程能力测试(3题,每题10分,共30分)
1.题目:
请用C++实现一个函数,输入一个无重复元素的整数数组,返回所有可能的子集(不包含空集)。要求时间复杂度尽可能低。
答案:
cpp
includevector
usingnamespacestd;
classSolution{
public:
vectorvectorintsubsets(vectorintnums){
vectorvectorintres;
vectorintpath;
backtrack(nums,0,path,res);
returnres;
}
voidbacktrack(vectorintnums,intstart,vectorintpath,vectorvectorintres){
res.push_back(path);
for(inti=start;inums.size();++i){
path.push_back(nums[i]);
backtrack(nums,i+1,path,res);
path.pop_back();
}
}
};
解析:
-采用回溯算法,时间复杂度为O(2^n),其中n为数组长度。
-通过递归遍历所有可能的子集,不包含空集。
-关键在于`start`参数的传递,确保每个元素只被使用一次,避免重复。
2.题目:
请用Python实现一个函数,输入一个字符串,返回其中不重复字符的最长子串长度。例如,输入abcabcbb,返回abc的长度3。
答案:
python
deflength_of_longest_substring(s:str)-int:
char_set=set()
left=0
max_len=0
forrightinrange(len(s)):
whiles[right]inchar_set:
char_set.remove(s[left])
left+=1
char_set.add(s[right])
max_len=max(max_len,right-left+1)
returnmax_len
解析:
-使用滑动窗口技术,`left`和`right`分别表示窗口的左右边界。
-`char_set`用于存储窗口中的字符,避免重复。
-每当发现重复字符时,移动`left`并删除对应字符,直到窗口无重复字符。
-时间复杂度为O(n),空间复杂度为O(min(m,n)),其中m为字符集大小。
3.题目:
请用Java实现一个方法,输入一个链表,返回其反转后的链表。例如,输入1-2-3,返回3-2-1。
答案:
java
classListNode{
intval;
ListNodenext;
ListNode(intx){val=x;}
}
publicclassSolution{
publicListNodereverseList(ListNodehead){
ListNodeprev=null;
ListNodecurrent=head;
while(current!=null){
ListNodenextTemp=current.next;
current.next=prev;
prev=current;
current=nextTemp;
}
returnprev;
}
}
解析:
-采用迭代法反转链表,时间复杂度为O(n),空间复杂度为O(1)。
-`prev`表示前一个节点,`current`表示当前节点,`nextTemp`用于保存下一个节点。
-逐步将`current.next`指向前一个节点,直到整个链表反转。
二、算法与数据结构(4题,每题7分,共28分)
1.题目:
请解释快速排序的工作原理,并说明其时间复杂度和适用场景。
答案:
-工作原理:
1.选择一个基准值(pivot),通常为第一个或最后一个元素。
2.将数组分为两部分,左边的元素都小于基准值,右边的元素都大于基准值。
3.递归地对左右两部分进行排序,最终得到有序数组。
-时间复杂度:
-最好/平均:O(nlogn)
-最坏:O(n^2)(当基准值选择不当,如已排序数组)
-适用场景:
-大规模数据排序,尤其是内存足够时。
-不适合链表排序(因为随机访问效率低)。
解析:
-快速排序是分治算法的经典应用,通过递归实现。
-基准值的选择会影响性能,实际应用中常采用三数取中法。
2.题目:
请
原创力文档

文档评论(0)