- 0
- 0
- 约5.27千字
- 约 15页
- 2026-01-19 发布于福建
- 举报
第PAGE页共NUMPAGES页
2026年百度算法工程师面试题
一、编程题(共3题,每题15分,总分45分)
1.(15分)字符串匹配问题
题目:
给定两个字符串`text`和`pattern`,其中`text`的长度为`n`,`pattern`的长度为`m`。请实现一个函数`findPattern(text,pattern)`,返回`pattern`在`text`中第一次出现的位置(从0开始计数)。如果`pattern`不在`text`中,返回`-1`。
要求:
-使用KMP算法实现,时间复杂度为O(n)。
-编写代码时,需先实现KMP算法的`computeLPSArray`函数,用于计算部分匹配表(LPS数组)。
答案与解析:
代码实现:
python
defcomputeLPSArray(pattern):
m=len(pattern)
lps=[0]m
length=0
i=1
whileim:
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
deffindPattern(text,pattern):
n=len(text)
m=len(pattern)
ifm==0:
return0
lps=computeLPSArray(pattern)
i=0#text的指针
j=0#pattern的指针
whilein:
ifpattern[j]==text[i]:
i+=1
j+=1
ifj==m:
returni-j
elifinandpattern[j]!=text[i]:
ifj!=0:
j=lps[j-1]
else:
i+=1
return-1
解析:
KMP算法的核心在于通过`computeLPSArray`预处理`pattern`,构建部分匹配表。当`pattern`中某个字符与`text`不匹配时,LPS数组帮助快速跳过已匹配的前缀,避免重复比较。具体步骤如下:
1.`computeLPSArray`:遍历`pattern`,记录每个前缀的最长公共前后缀长度。例如,`pattern=ABABAC`,LPS数组为`[0,0,1,2,3,0]`。
2.`findPattern`:使用双指针`i`和`j`分别遍历`text`和`pattern`,当字符匹配时`i++`和`j++`;不匹配时,若`j`不为0,则将`j`移动到`lps[j-1]`,否则`i++`。当`j`达到`pattern`长度时,返回当前匹配起始位置。
2.(15分)TopK问题
题目:
给定一个包含`n`个整数的无序数组`nums`和一个正整数`k`,请实现一个函数`topKFrequent(nums,k)`,返回`nums`中出现频率最高的`k`个元素。可以按任意顺序返回。
要求:
-使用快速选择算法(Quickselect)结合计数排序优化实现,时间复杂度接近O(n)。
-先统计每个数字的频率,再根据频率排序。
答案与解析:
代码实现:
python
fromcollectionsimportCounter
deftopKFrequent(nums,k):
统计频率
freq=Counter(nums)
频率数组,每个元素是[数字,频率]
freq_list=[[num,count]fornum,countinfreq.items()]
快速选择算法
defquickselect(freq_list,k):
left,right=0,len(freq_list)-1
whileleftright:
pivot=partition(freq_list,left,right)
ifpivot==k-1:
return
elifpivotk-1:
right=pivot-1
else:
left=pivot+1
defpartition(freq_list,left,right):
pivot=freq_list[right][1]
i=left-1
forjinrange(left,right):
iffreq_list[j][1]=pivot:
i+=1
freq_list[i],
原创力文档

文档评论(0)