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