百度公司技术面试题及解析.docxVIP

  • 2
  • 0
  • 约8.33千字
  • 约 23页
  • 2026-03-13 发布于福建
  • 举报

第PAGE页共NUMPAGES页

2026年百度公司技术面试题及解析

一、编程基础(共5题,每题2分,合计10分)

题目1(2分):

请编写一个函数,实现将一个32位无符号整数的二进制表示中从右向左数的第一位1翻转(即0变1,1变0)。例如,输入`11`(二进制`1011`),输出`10`(二进制`1010`)。要求不使用循环,仅用位运算实现。

答案与解析:

答案:

cpp

intflipRightMostOne(unsignedintnum){

returnnum^(num-num);

}

解析:

-`num-num`:通过取反加1(`-num`是`num`的二进制取反加1)得到`num`最右边的1及其右边的所有0。例如,`num=11`(`1011`),`-num=~1011+1=0101+1=0110`,`num-num=10110110=0010`(即最右边的1)。

-`num^(num-num)`:将最右边的1翻转,其他位保持不变。例如,`num=1011`,`num-num=0010`,`num^0010=1011^0010=1001`(但题目要求仅翻转第一位1,正确结果应为`1010`,需调整思路)。

修正答案:

cpp

intflipRightMostOne(unsignedintnum){

returnnum^(1(log2(num-num)));

}

-`log2(num-num)`:计算最右边的1的位置(从0开始计数)。

更简洁的修正:

cpp

intflipRightMostOne(unsignedintnum){

returnnum^(1(32-__builtin_clz(num)-1));

}

-`__builtin_clz(num)`:计算`num`前导0的个数(C++内置函数)。

最终推荐:

cpp

intflipRightMostOne(unsignedintnum){

returnnum^(1(32-__builtin_clz(num)-1));

}

题目2(2分):

给定一个字符串`s`,请判断其是否为回文串(正读和反读相同)。假设字符串仅包含字母和数字,忽略大小写。例如,输入`Aman,aplan,acanal:Panama`,输出`true`。

答案与解析:

答案:

cpp

boolisPalindrome(conststd::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;

}

解析:

-双指针法:`left`从左向右,`right`从右向左移动,跳过非字母数字字符,并比较对应字符是否相同(忽略大小写)。

-`isalnum`:检查字符是否为字母或数字。

-`tolower`:统一转换为小写比较。

题目3(2分):

请实现一个函数,统计一个数组中所有奇数元素的平方和。例如,输入`[1,2,3,4,5]`,输出`1^2+3^2+5^2=35`。

答案与解析:

答案:

cpp

intsumOfOddSquares(conststd::vectorintnums){

intsum=0;

for(intnum:nums){

if(num%2!=0)sum+=numnum;

}

returnsum;

}

解析:

-遍历数组,判断每个元素是否为奇数,如果是则平方后累加。

-时间复杂度O(n),空间复杂度O(1)。

题目4(2分):

给定两个字符串`s1`和`s2`,请判断`s2`是否为`s1`的子串(不考虑顺序)。例如,输入`s1=abcde`,`s2=ace`,输出`true`。

答案与解析:

答案:

cpp

boolisSubstring(conststd::strings1,conststd::strings2){

if(s2.size()s1.size())returnfalse;

std::unordered_set

文档评论(0)

1亿VIP精品文档

相关文档