百度系列笔试题二-2012届百度移动终端研发2

共四道道
1. 简述线性表 二叉平衡树 哈希表存储数据时的优劣

线性表分为顺序存储结构和链式存储结构

顺序存储结构优点是可以实现随机读取,时间复杂度为O(1),空间利用率高;缺点是进行插入和删除操作时比较麻烦,时间复杂度为O(n),同时容量受限制,需要事先确定容量大小,容量过大浪费空间资源,过小不能满足使用要求,会产生溢出问题。链式存储结构优点,插入和删除非常简单,前提条件是知道操作位置,时间复杂度是O(1),但如果不知道操作位置则要定位元素,时间复杂度也是O(n),还有一个很大的优点是没有容量的限制,可以在使用过程中动态的分配内存空间,不用担心溢出的问题;缺点是它不能实现随机读取,同时空间利用率不高

二叉平衡树O(log n)时间内做查找,插入和删除,空间复杂度O(n)

哈希表O(1)时间内做查找,插入和删除,空间复杂度O(n)。
2.简答:一个十进制数m转化N进制,N属于[1, 16]。

void transfer(int m,int N)

{

     int aa[20],i,saveM=m;

     for(i=0;m!=0;i++)

     {

         aa[i]=m% N;

         m=m/ N;

     }

     printf("十进制数%d的%d进制形式是:\n",saveM, N);

     for(;i!=0;i--)

         printf("%d",aa[i-1]);

3.读程序
#include<iostream>

using namespace std;

int var_1=0;

char *pvar_1=NULL;

int main()

{

     intvar_2;

     charstr[]="abe";

     char*p="efs";

     int*kk=vector<int>;

     kk=new *int; 

         p=(char *)malloc(20);

     if(p==NULL)

         printf("dfdf");

     if(kk==NULL)

         pritnf("ddfdsfds");

     if(kk!=NULL)

         free(kk);

         if(p!=NULL)

              delete p;

} 1.c程序存储分类;
2.var_1 var_2 str p kk "efs""abe"分别存储在什么地方

var_1 :全局变量区var_2:栈str :栈p:堆 kk:堆"efs" ,"abe":文字常量区
3.p分配失败程序会怎样

输出dfdf
4. free (kk) delete p;有什么不妥,两种释放方式异同点?

可能内存泄露,应该是delete []kk ,free (p); free释放内存,但对象依然存在,delete自动析构。
四。系统设计题(40分)
对于一个递增数组,我们可以采用二分查找法判断数组是否存在数x。但现在有一不太规则的数组A’,但它又具备一定的规则性:在某一范围是递增,如数组序列:{15,16,17,21,1,4,6,7,100,124,156,…},在前4项是递增的,第5项到第9项也是…在这样的数组中,如何查找数x是否存在了。请详细给出你的算法。并分析算法的时间复杂度和空间复杂度。

本程序分为两个部分,循环数组采用特殊二分搜索,单调递增采用普通二分法。

//本程序由深大小雨所编,其功能是在循环数组里找x是否存在,这里我理解的循环只是两段如:7 8 9 10 1 2 5
//本算法思想是基于这样的一个事实:顺序递增可用二分快速查找,将上述的数组里砍成两半
//必得一个是顺序递增,另一个仍是循环递增(子问题)2011-10-11
#include<stdio.h>
int time;    //记录查找次数,方便验证其时间是否为logN

//bfind()即二分查找x,找到即返回1
int bfind(int *A,int low,int high,int x)
{    

	int mid;
	int flag=0;
	if(A[low]==x||A[high]==x)
	{ flag=1;
	return flag;
	}
	while(low<=high)
	{   mid=(low+high)/2;
	if(x==A[mid])
	{
		flag=1;
		printf("the %dth to find\n",++time);
		break;
	}
	//到x属于其范围的段里找
	else if(x>A[mid])    
	{
		printf("the %dth to find\n",++time);
		low=mid+1;}
	else if(x<A[mid]){
		printf("the %dth to find\n",++time);
		high=mid-1;}
	}
	return flag;    //找到返回1
}
//循环数组里的二分查找:其功能是将一数组砍成两段,若x在顺序递增里,即直接二分查找
//否则问题缩小为在新的循环数组里找x(子问题)

void find(int *A,int low,int high,int x)
{    
	int mid=(low+high)/2;
	if(low>high)
	{    printf("the %dth to find\n",++time);
	printf("no the elem\n");
	return;
	}
	else
	{
		printf("the %dth to find\n",++time);
		if(A[mid]>=A[low])    //前半部分递增
		{
			if((x>=A[low])&&(x<=A[mid]))    //要找的元素x大小符合递数组范围
			{
				if(bfind(A,low,mid,x)==1)    //调用找,找到返回1
					printf("the %d is found\n",x);
				else
					printf("no the elem\n");
			}
			else     //要找的x大小仍在循环数组范围里,认为这是子问题
				find(A,mid+1,high,x);    //递归调用
		}
		else    if(A[mid]<=A[high])    //后半部分递增
		{
			if((x<=A[high])&&(x>=A[mid]))    //要找的元素x大小符合递增数组范围
			{
				if(bfind(A, mid,high,x)==1)    //调用二分查找,找到返回1
					printf("the %d is found\n",x);
				else
					printf("no the elem\n");
			}
			else     //要找的x大小仍在循环数组范围里,认为这是子问题
				find(A,low,mid-1,x);    //递归调用
		}
	}

}
void main()
{
	int num[32]={15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
	int e;
	while(1){
		scanf("%d",&e);
		time=0;
		find(num,0,31,e);
	}
}

参考http://topic.csdn.net/u/20111009/14/bba5d32a-9216-4884-bcfc-5c83478eb5aa.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章