2026年百度算法工程师面试题.docxVIP

  • 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)

1亿VIP精品文档

相关文档