2012年百度实习生招聘——java开发

42 篇文章 0 订阅
本文分享了2012年百度实习生招聘中关于Java开发的面试题目,涉及简答题、算法设计和系统设计。简答题部分讨论了兄弟单词的解决方案,算法设计包括线程安全、内存管理和网页爬虫问题,而系统设计则探讨了处理大量数据的方案。
摘要由CSDN通过智能技术生成

简答题

1、给一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么b是a的兄弟单词,比如单词army和mary互为兄弟单词。
现在要给出一种解决方案,通过用户输入的单词,根据给定的字典找出输入单词有哪些兄弟单词。请具体说明数据结构和查询流程,要求时间和空间效率尽可能地提高。

解答:这题考试的时候没做出来,我想把一个单词的所有字母组合计算出来都不会算。。。有点郁闷大哭

后来上网找了下,用递归找出一个单词所有字母的组合。

#include<stdio.h>

void findAllWords(char* s,int start,int end){
	int i,j,k;
	char temp;
	if(start==end){
		for(i=0;i<end;i++)
			printf("%c",s[i]);
		printf("\n");
	}	
	else{
		k=start;
		for(i=start;i<end;i++){
			temp=s[i];
			s[i]=s[k];
			s[k]=temp;
			findAllWords(s,start+1,end);
			temp=s[i];
			s[i]=s[k];
			s[k]=temp;//将字符串恢复原样 
			}
			}
} 
int main(){
	char s[4]={'a','r','m','y'};
	findAllWords(s,0,4);
	return 1;
}


上述做法并不是最佳,纯粹是就提论题(解决abcd所有组合的问题)。

最佳的做法(From Internet)

首先定义a-z分别为从1开始的素数,例如a=2,b=3,c=5,d=7这样.

然后定义一个函数int Func(char* data)

然后函数里面对于每个单词的每个字母进行相乘,例如单词abc就等于5*2*3=30;返回30

然后再到字典里面去找与这个单词位数相同且Func返回值相同的单词就好了. 

这个算法主要用到了一个数学界的定理,如果一个正整数是n个素数相乘的结果,那么这个正整数有且只有一组素数解.


2、线程和进程的区别及联系?如何理解“线程安全”问题?
3、C和C++中如何动态分配和释放内存?他们的区别是什么?

new分配内存+构造对象,malloc只分配内存,delete析构对象并释放内存,free只释放内存

算法设计

1、网页爬虫在抓取页面时,从指定的url站点入口开始爬取这个站点上的所有url link,抓取到下一级link对应的页面后,同样对该页面上的link进行抓取从而完成深度遍历。为简化问题,我们假设每个页面上至多只有一个link,如从www.baidu.com/a.html链接到www.baidu.com/b.html再链接到www.baidu.com/x.html,当爬虫抓取到某个页面时,有可能再链接回www.baidu.com/b.html,也可能爬取到一个不带任何link的终极页面。当抓取到相同的url或者不包含任何link的终极页面时即完成爬取。爬虫在抓取到这些页面后会建立一个单向链表,用来记录抓取到的页面。如:a.html->b.html->x.html...->NULL.
问:对于爬虫分别从
www.baidu.com/x1.htmlwww.baidu.com/x2.html两个入口开始获得两个单向链表,得到这两个单向链表后,如何判断他们是否抓取到了相同的url?(假设页面url上百亿,存储资源受限,无法用hash方法判断其是否包含相同的url)
请先描述相应的算法,再给出相应的代码实现。(只需给出判断方法代码,无需爬虫代码)
2、数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序。要求空间复杂度为O(1)。注:al[i]元素是支持'<'运算符的。

描述下我的解法:

首先假设两个数组都是从小到大排序的,要求的结果也是从小到大排序的;

两个有序数组al[0,mid-1]和al[mid,num-1],找到al[0,mid-1]的第一个大于al[mid]]的数al[i],用一个中间变量保存al[mid],并将整个数组从al[i]往后 移动一位,移好后把al[mid]值赋给al[i],紧接着再比较al[mid+1]如此往复直到最后,每次我们都可以始终保证al[0...i]部分有序。

代码:

#include<stdio.h>
const int n=9;
//后移 
int* move(int* al,int start,int end){
	int temp;
	int i;
	temp=al[end];//保存开始元素 
	for(i=end;i>start;i--){
		al[i]=al[i-1];
	}
	al[start]=temp;
	return al;	
}
int main(){
	int al[n]={0,2,5,9,3,4,9,10,11};
	int mid=n/2;//舍 
	int i=0,j=mid;
	for(;i<n && j<n;){
		if(al[i]<al[j]){
			i++;
		}
		else{
			move(al,i,j);
			i++;j++;
		}
	}
	for(i=0;i<n;i++){
		printf("%d ",al[i]);
	}
}


系统设计

两个200G大小的文件A和B,AB文件里内容均为无序的一行一个正整数字(不超过2^63),请设计方案,输出两个文件中均出现过的数字,使用一台内存不超过16G、磁盘充足的机器。
方案中指明使用java编程时使用到的关键工具类,以及为什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值