华为研发部门面试经验与题目解答.docxVIP

  • 0
  • 0
  • 约9.6千字
  • 约 26页
  • 2026-02-12 发布于福建
  • 举报

第PAGE页共NUMPAGES页

2026年华为研发部门面试经验与题目解答

一、编程基础与算法(共5题,每题15分,总分75分)

1.题目:

实现一个函数,输入一个整数数组,返回数组中所有唯一元素的中位数。例如,输入`[1,2,2,3,4]`,返回`2`;输入`[1,1,2,3]`,返回`2`。

要求:时间复杂度O(n),空间复杂度O(1)。

答案与解析:

答案:

cpp

intfindMedianUnique(int[]nums){

intn=nums.length;

if(n==0)return-1;

//统计频率

int[]freq=newint[20001];//假设数值范围在[-10000,10000]

for(intnum:nums){

freq[num+10000]++;

}

intuniqueCount=0,median=0;

for(inti=0;ifreq.length;i++){

if(freq[i]==1){

uniqueCount++;

if(uniqueCount==n/2+1){

median=i-10000;

break;

}

}

}

returnmedian;

}

解析:

-首先统计每个数字的频率,假设数字范围在[-10000,10000],因此使用长度20001的数组存储频率。

-遍历频率数组,找到所有唯一元素,计算中位数。由于中位数是唯一元素的第`n/2+1`个(n为唯一元素数量),因此只需遍历一次频率数组即可找到中位数。

-时间复杂度O(n),空间复杂度O(1)(忽略输入数组占用的空间)。

2.题目:

实现一个函数,输入一个字符串,返回该字符串的最长回文子串的长度。例如,输入`babad`,返回`3`(bab或aba)。

答案与解析:

答案:

cpp

intlongestPalindromeSubseq(strings){

intn=s.length();

vectorvectorintdp(n,vectorint(n,0));

//初始化对角线

for(inti=0;in;i++){

dp[i][i]=1;

}

//从短到长遍历

for(intlen=2;len=n;len++){

for(inti=0;i+len-1n;i++){

intj=i+len-1;

if(s[i]==s[j]){

dp[i][j]=dp[i+1][j-1]+2;

}else{

dp[i][j]=max(dp[i+1][j],dp[i][j-1]);

}

}

}

returndp[0][n-1];

}

解析:

-使用动态规划解决,dp[i][j]表示s[i..j]的最长回文子串长度。

-初始化对角线,单个字符都是回文,因此dp[i][i]=1。

-从长度为2开始遍历,如果s[i]==s[j],则dp[i][j]=dp[i+1][j-1]+2;否则,dp[i][j]=max(dp[i+1][j],dp[i][j-1])。

-最终结果为dp[0][n-1]。

3.题目:

实现一个函数,输入一个整数n,返回n的二进制表示中1的个数。例如,输入`11`(二进制`1011`),返回`3`。

答案与解析:

答案:

cpp

intcountBits(intn){

intcount=0;

while(n!=0){

count+=n1;

n=1;

}

returncount;

}

解析:

-使用位运算,每次右移一位,统计最低位的1的数量。

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

4.题目:

实现一个函数,输入一个链表,返回该链表是否为回文链表。例如,输入`1-2-2-1`,返回`true`。

答案与解析:

答案:

cpp

boolisPalindrome(ListNodehead){

if(!head)returntrue;

//找到中点

ListNodeslow=head,fast=head;

while(fast-nextfast-next-next){

slow=slow-next;

fast=fast-next-next;

}

//反转后半部分

ListNodeprev=nullptr,

文档评论(0)

1亿VIP精品文档

相关文档