阿里巴巴笔试题

闲着无聊逛博客的时候看到了这儿(http://blog.csdn.net/thebestdavid/article/details/11975809)的一些今年的面试题,试了下,然后在博客后和其他人有过一些讨论。博主邀请我写了这篇博客。

前面三道都比较简单,但是可以说说扑克牌那道题目,

2、一副牌52(去掉大小王),从中抽取两张牌,一红一黑的概率是多少?

看成排列题貌似更简单点,第一次红色,第二次黑色,或者第一次黑色,第二次红色——所以

26/52*26/51*2 = 26/51。

26/52——(52张牌中有26张红(黑)牌)

26/51——(剩下的51张牌中还有26张黑(红)牌)

2——(可能先拿红色,也可能先拿黑色)

4、已知三个升序整数数组a[l], b[m]和c[n]。请在三个数组中各找一个元素,使得组成的三元组距离最小。三元组的距离定义是:假设a[i]、b[j]和c[k]是一个三元组,那么距离为:

Distance = max(|a[ I ] – b[ j ]|, |a[ I ] – c[ k ]|, |b[ j ] – c[ k ]|)

请设计一个求最小三元组距离的最优算法,并分析时间复杂度。

一种思路是把所有数字放在坐标轴上,然后就变成了在这个坐标轴上找一条线段,该线段覆盖来自三个数组的至少各一个点,java代码基本如下:这样之后,就变成了从groups中找distance最小的那个group了。最终复杂度应该为O(m+n+l)

Num[] nums = new Num[] {};//三个数组的数字都放在这个里面
		List<Group> groups = new ArrayList<Group>();
		Group group = new Group();
		group.num1 = nums[0];
		for (int i = 1; i < nums.length; i++) {
			if (group.num2 == null) {
				if (group.num1.type == nums[i].type)
					group.num1 = nums[i];
				else
					group.num2 = nums[i];
			}else if(group.num3==null){
				if (group.num1.type == nums[i].type){
					group.num1 = group.num2;
					group.num2 = nums[i];
				}else if(group.num2.type == nums[i].type){
					group.num2 = nums[i];
				}else{
					group.num3 = nums[i];
					group.distance = group.num3.value - group.num1.value;
					groups.add(group);
					Group temp = new Group();
					temp.num1 = group.num2;
					temp.num2 = group.num3;
					group = temp;
				}
			}
		}

5、在黑板上写下50个数字:1至50.在接下来的49轮操作中,每次做如下动作:选取两个黑板上的数字a和b,擦去,在黑板上写|b - a|。请问最后一次动作之后剩下数字可能是什么?为什么?

这个题目容易误导我们,让我们以为是某个确切的数字,那样会浪费非常多的时间。我的答案是“奇数”,如果能往这个方向想那这道题目就非常简单了。

1.确定结果为奇数:

1-50的50个数字中 有25个奇数,25个偶数,奇数个奇数做任意+/-运算都是奇数,任意多个偶数做+/-运算都是偶数(绝对数可以通过交换顺序解决,不解释)——这些都是小学数学中的知识。所以确定运算结果肯定是奇数。

2.确定1-49之间的每个奇数都有可能:

把任意一个奇数抽取出来之后,通过将数字从后往前依次两两组合相减,我们总是可以得到22个1和一个2,可以抵消为0.

以1为例,假设是2-50之间的数,50-49,48-47……,4-3,2得到22个1和一个2,可以抵消为0,故而1有可能

以3为例,假设1,2,4-50,同理,50-49,……6-5,4-2,1得到22个1和1个2,可以抵消为0,故而3有可能

以25为例,假设1-2,同理,50-49,… 28-27,26-24,23-22,…,5-4,3-2,1得到22个1和1个2,抵消为0,

故而,1-50中的每一个奇数都有可能

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值