校招笔记

8月24日,进行cvte的基础测评,四十道逻辑思维题一小时,因为没有准备,直接测评的,所以被虐了了。深感时间不够用,所以,下一次参加在线测评时,一定要记得把东西准备好,并且,参加测评前就做几道预热。机会总是留给有准备的人。

8月25日,进行了职业测评和软件测评B卷。还是被虐的感觉。c,c++,c#,java,甚至php等等语言都有点。数据结构,操作系统,网络,数据库,同样什么都有点。时间充足,甚至够我偶尔去百度答案。但是一定要看清题目和选项啊,不要着急,沉稳地点击提交进入下一题。因为一旦提交,就没有机会回去更改,常常是刚刚提交做下一题,脑子里一闪而过,刚才粗心了。

估计和cvte无缘了,就当是练手吧。

给自己一个警记。不再犯这种错误。


8月29日,阿里研发在线笔试。祝我顺利。阿里直接笔试挂了。。。


美团笔试:

1、美团有个传统,就是公司各部门每月都要组织员工进行一次团建互动(team building,简称TB),每个员工都可以带家属参加。活动内容出了吃喝玩之外,还要做一些互动的游戏,需要从员工中随机选出几名组成一队来完成游戏。一次TB活动,一共有20个人(含员工和家属)参加。已知如果随机选取3位员工以及该3位员工的家属,一共有220组合。问如果每次随机选取4个员工及该4位员工的家属,会有多少组合?

2、有一组随机排列的字母数组。请编写一个时间复杂度为O(n)的算法,使得这些字母按照字母从小到大顺序排好。

说明:字母区分大小写,相同的字母,排序后小写排在大写前。

例如:R,B,B,b,W,W,B,R,B,w

排序为:b,B,B,B,B,R,R,w,W,W

1)描述思路(2分)

2)请用你熟悉的编程语言编码实现(8分)

3、给定N个磁盘,每个磁盘大小为D[i],i=0,…N-1。现要在这N个磁盘上“顺序分配”M个分区。每个分区大小为P[j],j=0,…M-1。顺序分配的意思是:分配一个分区P[j]时,如果当前磁盘剩余空间足够,则在当前磁盘分配;如果不够,则尝试下一磁盘,直到找到一个磁盘D[i+k]可以容纳该分区。分配下一个分区P[j+1]时,则从当前磁盘D[i+k]的剩余空间开始分配,不再使用D[i+k]之前磁盘的未分配空间。如果这M个分区不能在这N个磁盘完全分配。则认为分配失败。请实现函数is_allocable 判断给定N个磁盘(数组D)和M个分区(数组P),是否会出现分区分配失败的情况。

举例:磁盘为[120,120,120],分区为[60,60,80,20,80]可分配,如果为[60,80,80,20,80],则分配失败。

4、给定整数x,定义函数A(n)=1+x+x2+x3+…+xn(n为整数且n>=0).已知乘运算的时间远大于加运算,输入x,n;如何尽可能快的求出A(n)?

要求:

1)描述思路(2分)

2)评估你的算法需要进行多少次乘法?(3分)

3)请用你熟悉的编程语言编码实现(5分)

解答:1)利用等比数列求和公式:。并没有减少乘法次数,但是减少了加法次数。或者利用一个long类型值记录下每次乘法的数。以便下一次乘法直接相乘。

2)n

3

public long sum(int x, int n){	
		if(n == 0)
			return 1L;
		
		long sum = 1+x;
		long pro = x;
		for(int i = 1; i < n; i++){
			pro *= x;
			sum += pro;
		}
		return sum;
	}
	
	public long sumBySum(int x, int n){
		if(n == 0)
			return 1;
		long pro = x;
		for(int i = 1; i <= n; i++){
			pro *= x;
		}
		return (pro-1)/(x-1);
	}

 

5、请实现方法:print_rotate_matrix(int[] matrix, int n), 将一个n×n二维数组逆时针旋转45度后打印,例如,下图显示一个3×3的二维数组及其旋转后屏幕输出的效果。

描述思路(2分)

请用你熟悉的语言编码显示(8分)

public void print_rotate_matrix(int[][] matrix, int n){
		int[][] sign = new int[n][n];
		for(int i = 0; i < n; i++){
			for(int j = n-1-i; j >=0; j--){
				if(sign[i][j] !=1){
					System.out.print(matrix[i][j]+"\t");
					sign[i][j] = 1 ;
				}
				if(i ==n-1 || j == n-1)
					System.out.println();
				int k = i+1, m = j+1;
				while(k < n && m < n){
					if(sign[k][m] !=1){
						System.out.print(matrix[k][m]+"\t");
						sign[k][m] = 1 ;
						if(k == n-1 || m == n-1)
							System.out.println();
					}	
					k++;
					m++;
				}
				
			}
		}
	}


6、已知队列(Queue)支持先进先出的操作add/remove,而栈(Stack)则支持先进后出的操作push/pop,请用两个队列实现栈先进后出的操作,希望该栈的push/pop时间复杂度尽量小。

1) 简述思路(3分)

2) 已知这两个队列的容量为M,该栈的容量是多少(1分)M

3) 假设队列的每次Add/Remove操作时间复杂度O(1),N代表存储在栈里的元素个数,请评估该栈的push/pop操作时间复杂度(1分)

4) 写出push/pop的代码,需要考虑栈溢出(stackoverflow)的情况(3分)

7、任务调度在分布式调度系统中是一个很复杂很有挑战的问题。这里我们考虑一个简化的场景:假设一个中央调度机,有n个相同的任务需要调度到m台服务器上去执行。由于每台服务器的配置不一样,因此服务器执行一个任务所花费的时间也不同。现在假设第i个服务器执行一个任务需要的时间为t[i]。

例如:有2个执行机a, b. 执行一个任务分别需要7min,10min,有6个任务待调度。如果平分这6个任务,即a,b各分三个任务,则最短需要30min执行完所有。如果a分这4个任务,b分2个,则最短28min执行完。

请设计调度算法,使得所有任务完成所需的时间最短

1) 简述思路(2分)

2) 请用你熟悉的编程语言编码实现以下方法,输入为m台服务器,每台机器处理一个任务的时间为t[i],完成n个任务,输出n个任务在m台服务器的分布(8分):

int estimate_process_time(int[] t, int m, int n);

8、n个元素{1,2,……,n}有n!个不同的排列。江浙n!个排列按字典序列排列。并编号为0,1,……,n!-1。每个排列的编号为其字典序的值。例如,当n=3是,其字典排序为:123,132,213,131,312,321,这6个数的字典序值分别为0,1,2,3,4,5。现给定任意n,输出字典序为k的排列(0<=k<=n!-1)。

 


9月15日,华为机试,题目不难,但是要拿满分还是有点困难的,挂在了最后一道题上,一开始的思路没有考虑它可能不是满二叉树,导致后面6个用例未通过,后来想改也没有时间了。


2014/9/14 百度笔试

题目不多,总共七道。涵盖了计算机网络,操作系统,数据库,数据结构和算法,还有最后一道大题,实在是没有思路。
1.tcp/ip的三次握手及四次挥手。并且解释为何要用四次挥手。
2.计算机操作系统内存管理淘汰算法。
3.数据库中使用哪些范式
1.求链表的中项节点。
2.集合s中有n个正整数,求最大元素c=a+b,a,b均在集合s中。
3.用堆栈模拟队列。实现入队出队,判空等功能并进行单元测试。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值