首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

2012百度校招试题(移动终端研发 深圳),该怎么解决

2012-03-16 
2012百度校招试题(移动终端研发 深圳)共四道道1. 简述线性表 二叉平衡树 哈希表存储数据时的优劣2.简答:一

2012百度校招试题(移动终端研发 深圳)
共四道道
1. 简述线性表 二叉平衡树 哈希表存储数据时的优劣
2.简答:一个十进制数m转化N进制,N属于[1, 16]。
3.读程序(程序我只记得个大概)
#include<iostream>

using namespace std;

int var_1=0;
char *pvar_1=NULL;
int main()
{
  int var_2;
  char str[]="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"分别存储在什么地方
3.p分配失败程序会怎样
4. free (kk) delete p;有什么不妥,两种释放方式异同点?


四。系统设计题(40分)
对已排好序的数组A,一般来说可用二分查找 可以很快找到。
现有一特殊数组A[],它是循环递增的,如A[]={ 17 19 20 25 1 4 7 9},
试在这样的数组中找一元素x,看看是否存在。
请写出你的算法,必要时可写伪代码,并分析其空间 时间复杂度。


[解决办法]
你第四题答错了。所谓的循环递增是说分段符合递增,并未说只有两段,可能存在N段,你答题的思路是基于那个例子,只有两段递增区间,这是片面的。

应该是:解题关键是找到递增区间的分隔点,由分隔点进行差别
1、先从中选取一点。判断它左右两点,确认是否为边界点
2、分左边界,中间,右边界三种情况分别处理
3、根据递增和给定X值,在符和条件的区间进行分段查找,重复上速过程
这样才能得到正确的解。呵呵。。。下班了,没时间,有时间可试着写个程序证明一下。
[解决办法]
第一题:
对于优劣势,一方面考虑存储,一方面考虑性能:
线性表:可以用顺序表和链表实现,而且存储结构不一样,性能也不一样,总的来说线性表的优势是结构简单,访问节点比较快,对单节点的操作比较简单;适合于小数据量的存储,并且访问不存在经常变化的需求;
散列表:实现了随机访问,所以性能比较快,但是对于散列函数的设计要求比较高,而且设计需要根据自己的需求进行设计,实现高访问;
二叉平衡树:比较灵活,在空间上可以实现高效压缩存储,但是对于节点的操作比较复杂
第二题:
根据进制之间的转化关系:
首先要定义算法,即求余取模,但是这样做效率不高,除法运算的效率比较低,可以使用一种类似8421编码实现所有算法的转化
第三题:
(1)heap,stack,code segment,data segment,regsiter
(2)
stack: var_1 var_2 str
heap:p kk 
data segment:"efs" "abe"
(3)输出:dfdf
(4)delete 只是销毁值,但是空间依然存在
free 释放空间
所以先delete 然后free 这样就比较安全
第四题:
既然二分法排序,而且序列中出现小的数据聚集现象,那就应该先进行归并排序,然后再进行2分法查找

[解决办法]

探讨

你第四题答错了。所谓的循环递增是说分段符合递增,并未说只有两段,可能存在N段,你答题的思路是基于那个例子,只有两段递增区间,这是片面的。

应该是:解题关键是找到递增区间的分隔点,由分隔点进行差别
1、先从中选取一点。判断它左右两点,确认是否为边界点
2、分左边界,中间,右边界三种情况分别处理
3、根据递增和给定X值,在符和条件的区间进行分段查找,重复上速过程
这样才能得到正确的解。……

[解决办法]
3题2问,代码中看问题:
#include<iostream>

using namespace std;

int var_1=0;
char *pvar_1=NULL;
void main()
{
int var_2=9; //var_2是局部变量分配在栈中
char str[]="abe"; //str指针的值:0x0012ff54 指向栈中的一个地址,即“abe"在栈中。。。
char *p="efs"; //p指针的值:0x00417844 指向文字常量区中的一个地址,即"efs"在文字常量区中。。。
int *ll=&var_1; //var_1指针的值:0x00419138 指向全局(静态)区(static)中的一个地址。。。
int *mm=(int*)&pvar_1; //pvar_1指针的值:0x0041913c 指向全局(静态)区(static)中的一个地址。。。
int *kk=&var_2; //var_2指针的值:0x0012ff60 
int *nn=(int*)&str; //str指针的值:0x0012ff54 
int *dd=(int*)&p; //p指针的值:0x0012ff48 
p =(char *)malloc(20);
if(p==NULL)
printf("dfdf");
if(kk==NULL)
cout<<"ddfdsfds";
if(kk!=NULL)
free (kk); //因KK是栈中的区域,所以会有运行时错误。。。所以调试时可以把此处注释掉。。。
if(p!=NULL)
delete p;
}

调试环境为VS2010.net

热点排行