程序员笔试题--2012百度实习生笔试题

今天的笔试只有6道题目,前三道简答题,都是最基本的题目;两道程序设计题,这两题目还是有点难度;一道系统设计题,输入前提示,如果做过前台开发的孩纸,肯定接触过这一块,其实原理是很简单的!言归正传,上题.....


一.有一个字典,输入一个单词a,输入字典中a的所有兄弟单词,兄弟单词的意思就是:所含的字母及其该字母个数是一样的例如 army  输出 mary等.

这个题目,我使用了trie树进行解决的。

首先,根据单词里面的每一个字母建一个trie树,然后对每个树和字典之间进行比对。(现在想想,用Trie树是不能解决这个问题的,呵呵!之前怪自己修炼不够,让大家见笑了!

昨晚看到一贴,现在也把别人的答案摘抄如下:

1),每个单词对应char[127]的数组,char[n]表示字母ASCII字母n的出现次数,于是查找的时候就可以memcmp高效的去比较了。

针对这个char数组的大小,主要原因是ASII表前127个字符,所对应的ASII值,但是我不知道,怎么去算这个数值呢?
2),3)个方案:
1,随便把5个key用各种变化+Hash算出个值开散列一下就行了。
2,也多级哈希,先按A+key散列,如果冲突那么进入2级哈希,用a+key散列,再冲突进入i+key散列,一共4级,第5级是极限了,必须开散列了,前边4级可以闭散列。这样的优点很明显,计算哈希比较快,前4级内存是静态的,效率也高。
3,如果将来希望按照级别来浏览日志,难度也不算大。


二.c和c++分配和释放内存的方式是什么?区别在哪里?

这个我主要写的是c里面的是malloc/calloc/realloc/free和C++中的new/delete以及他们之间的区别。

malloc/calloc/realloc 都是分配内存空间,但是区别分别是:malloc分配空间之后,里面的数据都是随机的数据,而calloc空间内会被初始化为0;realloc:是给原来的空间重新申请空间,这次空间的大小要比原来的大才行。free,是对这些个申请的内存空间进行释放。malloc/calloc/realloc/free是库函数,new/delete是运算符。new/delete可以创建对象和消除对象。他们都可以动态的申请内存和释放内存。对象在创建的时候要调用构造函数,消亡的时候要调用析构函数,这些malloc和free都无法操作。


三.进程和线程的区别和联系?如何理解“线程安全”?

下面答案摘抄网上,仅供参考:

      一 程序只是一组指令的有序集合,

  二 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位;

  三 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程;

  一 进程与线程区别与联系

  (1)    划分尺度:线程更小,所以多线程程序并发性更高;

  (2)    资源分配:进程是资源分配的基本单位,同一进程内多个线程共享其资源;

  (3)    地址空间:进程拥有独立的地址空间,同一进程内多个线程共享其资源;

  (4)    处理器调度:线程是处理器调度的基本单位;

  (5)    执行:每个线程都有一个程序运行的入口,顺序执行序列和程序的出口,但线程不能单独执行,必须组成进程,一个进程至少有一个主线程。简而言之,一个程序至少有一个进程,一个进程至少有一个线程.


四.题意分析下为:两个很长的单链表,求单链表最后是否是走到一起了?

这个题目相对来说比较简单,主要是怎么挖掘题目中的意思,题目说了很长的一段,搞的头都晕掉了,说什么上百亿,什么不允许使用hash。都是在麻痹你的思想,说到最后就是我写的题意。简单吧!最后就是求链两个链表是否相交!

思路:

1)先求的俩个链表的长度,记为a和b;

2)假设a>b,则长度为a的链表的指针先走a-b个长度,然后两个链表的指针同时走,如果中间有元素相同,则说明相交,否则不相交!(a<b的情况类似)

【后记】也许这个题,我上面的答案有欠考虑。毕竟数据很多,上百亿。


五.一个数组a,前部分和后部分都是有序的,在空间复杂度为O(1)的情况下,使得整个数组a有序.

//一个数组a,前部分和后部分都是有序的,在空间复杂度为O(1)的情况下,使得整个数组a有序.

int main()
{
	int a[11]={1,2,3,4,8,5,7,9,12,32,34};
	for(int i=5;i<11;i++)
	{
		int temp=a[i];
		for(int j=i-5;j<i;j++)
		{
			if(a[j]>a[i])
			{
				while(j<i)
				{
					a[i]=a[i-1];
					i--;
				}
				a[j]=temp;
			}
		}
	}
	for(int k=0;k<11;k++)
		cout<<a[k]<<" ";
	return 0;
}



六.输入前提示实现的原理是什么?内部是怎么实现的,有没有更好的方式在时间复杂度和空间复杂度上?

做过前端开发的孩纸,肯定对于这样的题目会有所接触。这就是google里面有名的输入前提示。很多这方面的源代码!你可以去下载下看看哈!如果还有疑问的话,我就在细细的解释下,嘿嘿!

跑了一上午,累死人了!

这次笔试,感觉做的不是很好!

自己还有很多的东西需要学习。。。。

Fighting。。。


针对上面的题目,大家有什么好的解答方式,别忘记了留言给俺解答哈!吼吼!

你可能感兴趣的:(多线程,c,Google,百度,活动,前端开发)