百度系列筆試題二-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

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