百度笔试面试题

时间:2021-10-17 14:14:02


 1用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。

#include<stdio.h>
#include<string.h>
bool revert(char * pstr)
{
//revert函数
//在输入字符串上,将原串倒序
int i(0),n(strlen(pstr)-1);
for(;i<n;i++,n--)
{
pstr[i]^=pstr[n];
pstr[n]^=pstr[i];
pstr[i]^=pstr[n];
}
return 1;
}
void main(char arg[])
{
char p[]="abcdefghijkl";
revert(p);
for(int i=0;i<strlen(p);i++)
{
printf("%4c",p[i]);
}
getchar();
}

2.用C语言实现函数void * memmove(void *dest,const void *src,size_t n)。memmove
函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。
 

#include<stdio.h>
#include<string.h>
void * memmove(void *dest,const void *src,size_t n)
{
char *pstr1=(char*)src;
char *pstr2=(char*)dest;
if(pstr1==NULL||pstr2==NULL)
{
return NULL;
}
if(dest==src)
{
return dest;
}
if(pstr2<pstr1)
{
for(int i=0;i<n;i++)
{
*pstr2=*pstr1;
pstr2++;
pstr1++;
}
}
else
{
pstr2+=n-1;
pstr1+=n-1;
for(int i=0;i<n;i++)
{
*pstr2=*pstr1;
pstr2--;
pstr1--;
}
}
return dest;

}
void main(char arg[])
{
char p[]="abcdefghijkl";
char *q=p-5;
memmove(q,p,6);
for(int i=0;i<strlen(q);i++)
{
printf("%4c",q[i]);
}
getchar();
}

3 英文拼写纠错:
在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已经有一个包
含了正确英文单词的词典,请你设计一个拼写纠错
的程序。
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度;
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。

一时没有思路

4 寻找热门查询:
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串
的长度为1-255字节。假设目前有一千万个记录,
这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个
。一个查询串的重复度越高,说明查询它的用户越多,
也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度。

 

4条记录是1KB,1000万条记录是2.5G,内存只有1G,我分3次将这1000万条记录读进内存,并用hash表存储这些记录的index,并记录出现的次数。空间复杂度为O(n),时间复杂度为O(n),并维护一个大小为10的一棵大堆。

 5. 求符合指定规则的数。
给定函数d(n) = n    n的各位之和,n为正整数,如 d(78) = 78 7 8=93。 这样这个函数
可以看成一个生成器,如93可以看成由78生成。
定义数A:数A找不到一个数B可以由d(B)=A,即A不能由其他数生成。现在要写程序,找出
1至10000里的所有符合数A定义的数。

#include<stdio.h>
#include<string.h>
int generate_num(int n)
{//T_num 返回找到符合条件的数的个数
int T_num=0;
for(int i=1;i<=n;i++)
{
int k=1;
int num=i;
while((num/=10)>0)k++;
int maxgap=9*k;
int flag=1;
for(int left=i-maxgap>0?i-maxgap:1;left<i;left++)
{
num=left;
int sum=num;
while(num>0)
{
sum+=num%10;
num/=10;
}
if(sum==i)
{
flag=0;
break;
}
}
if(flag)
{
T_num++;
if(T_num%10==0)printf("\n");
printf("%d ",i);
}
}
return T_num;
}
void main(char arg[])
{
generate_num(10000);
getchar();
}

6 两个已排好序的a[N],b[N],输出其归并后的序列中第N个和第N+1个数。

 

答案是从一半的位置开始找。