闲着无聊逛博客的时候看到了这儿(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中的每一个奇数都有可能