记录一次面试

1. 十二个鸡蛋,其中有一个是坏的,坏鸡蛋不知轻重,问怎么用天平在三次内找出坏鸡蛋?

答:12个鸡蛋分3组4个一组,取出1.2组过秤剩下第3组.(这三组可以随便称呼)第一种情况:天平不平衡:坏的鸡蛋在1和2组里,则第3组里全是好鸡蛋.这里天平必然一端重一端轻.从轻的一端(反之亦然)取出3个剩下的1个鸡蛋叫A.把重的一端取出3个放在轻的一端剩下的1个鸡蛋叫B.从好鸡蛋组里拿3个和B放在一起.1、第二次过秤如果轻的还是轻,那么坏的不是A就是B.第三次用天平:A和B随便拿一个放天平上另一边放一个好蛋就可以判定出AB那个是坏的了.2、第二次过秤如果天平平衡了,A和B就不是坏鸡蛋了.坏的必然在从轻的那端取出的3个鸡蛋里,因为这三个鸡蛋出于轻端,所以坏鸡蛋一定比好的轻.知道轻重,第三次把这3个鸡蛋拿出2个放在天枰两端,平衡了说明坏的是另一个,不平衡上杨的一端是坏鸡蛋.3、第二次过秤如果天平轻的反而重了.由于在这种情况下A和B不可能是坏鸡蛋,判定坏鸡蛋一定比好的重,并必然在从重的那端拿到轻的那端的3个鸡蛋里.同理第三次就可以判断出了.第二种情况:天平平衡:坏的在3组里.第二次过秤从含坏的第3组拿出3个,和好的鸡蛋3个过秤,如果天秤平,剩下的那个是坏的.如果不平,从此知道好鸡蛋与坏鸡蛋的轻重.坏鸡蛋就在这3个里面,从这三个里面拿出2个放在天平两端,平衡了,没过秤的是坏鸡蛋.不平衡根据第二次过秤知道坏鸡蛋的轻重就可以判断出来那个鸡蛋是坏的了


2. 有两扇门,一扇是生门一扇是死门,两门各有一个守卫看守,其中一个守卫只说真话,另一个只说假话。 你既不知道哪个门是生门哪个门是死门,也不知道哪个守卫说真话哪个守卫说假话。 但你只要随便问其中一个守卫一个问题,就知道哪个守卫说真话,哪个守卫说假...

答:随机找一个门卫问他:如果我问另一个门卫,他将告诉我这扇门是生门吗?回答是,那么这门是死门;反之,是生门。


3. 小王,小张和小李在一起,一位是工人,一位是农民,一位是战士,已知小李比战士年龄大 小王比农民年龄大,农民比小张年龄大,谁是工人,谁是农民,谁是战士?

答:小王比农民年龄大,农民比小张年龄大,说明小王和小张都不是农民,那么就只有小李是农民.
而且可能得出,小王大于农民,农民大于小张,小王比小张年龄大,最小的是小张,由于小李比战士年龄大,所以小张是战士,剩下的小王是工人.
因此:小王是工人,小李是农民,小张是战士。


4. 有一牧场,已知养牛27头,6天把草吃尽;养牛23头,9天把草吃尽。如果养牛21头,那么几天能把牧场上的草吃尽呢?并且牧场上的草是不断生长的。

答:12天
这类题目的一般解法是:把一头牛一天所吃的牧草看作1,那么就有:
(1)27头牛6天所吃的牧草为:27×6=162
(这162包括牧场原有的草和6天新长的草。)
(2)23头牛9天所吃的牧草为:23×9=207
(这207包括牧场原有的草和9天新长的草。)
(3)1天新长的草为:(207-162)÷(9-6)=15
(4)牧场上原有的草为:27×6-15×6=72
(5)每天新长的草足够15头牛吃,21头牛减去15头,剩下6头吃原牧场的草:
72÷(21-15)=72÷6=12(天)
所以养21头牛,12天才能把牧场上的草吃尽。


5. 某大型企业的员工人数在1700~1800之间,这些员工的人数如果被5除余3,如果被7除余4,如果被11除余6。那么,这个企业到底有多少员工?员工小王略想了一下便说出了答案,请问他是怎么算出来的?

答:1733 人
首先,尾数是0或者5的话是可以被5整除的,所以排除了1700、1800和其他尾数是0和5的数,因此可以得到人数是一千七百多人。
好了,假设人数是17xy人。 那么用它分别除以5、7、11,就可以得到第一级余数分别是2xy、3xy和6xy。
1、因为这些员工的人数如果被5除余3,所以可以得到(因为5的倍数的尾数都是0或者5,所以加上余数3的话就可以得到);
2、因为这些员工的人数如果被11除余6,就可以推断出6xy的余数是6,又因为y是3或者8 ,所以可以得到6xy除以11第一级余数是28或83。
3、因为这些员工的人数如果被7除余4,就可以推断出3xy的余数是4,又因为y是3或者8 ,所以可以得到3xy除以7第一级余数是18或者53。从而可以得到xy是68或者33. 4、如果xy是68的话,就无法满足这些员工的人数被11除余6这一条件。
所以,就可以得到这些员工的人数为1733人。


6. 从幼儿园一排小朋友最左边第一个开始,每隔2人发一个梨;从右边第一个开始每隔4人发一个苹果,结果有10个小朋友梨和苹果都得到了.问题有多少小朋友?

答:每隔两人发一个梨,就是每3个人就有一个人拿到梨
每隔4人发一个苹果,就是每5人就有一个人拿到苹果
3和5的最小公倍数是15
所以每15人有一个人可以拿两种
所以是136个


7. 烧一根不均匀的绳子,从头烧到尾总共需要1个小时,问如何用烧绳子的方法来确定?

答:

关键在于不均匀,不然就更好处理了,就是在折半,折半,就好理解了。
因为从一头烧完需要1个小时,如果两头同时开始点燃,烧的速度相当于乘2,烧完的时间就变成半小时了,
网上经常问的是有两根不均匀的绳子 一根完全烧完是一个小时 如何判断30分钟和45分钟,
一根绳子两头都烧,
同时第二根只烧一头, 第一根都烧完的时候就是30分钟了
同时点燃第二根的另一头 再次烧完就是45分钟了。


8. 在一天当中,钟表的三根针能够重合吗?什么时候重合?钟表从0点(含)到24点(不含),分针和时针重合多少次?

答:
1. 如果是秒针走完60格后,分针才会走1格的情况下,重合23次。
1)第一次重合在0点;
2)从上次重合开始,分针走60多分钟才能追上时针,也即每个小时最多只能有一次重合的机会。在0点(不含)到1点之间,在11点到12点(不含)之间没有重合的机会,所以,这两段时间加起来能重合11次;
3)同样,在12点(含)到24点(不含)之间也有11次重合的机会。所以,分针和时针重合22次。
2. 如果是秒针每走1格,分针就移动1/60格情况下,3个指针只重合2次,第1次是0点整,第2次是12点整。

9. 快速排序

1) 首先是进行一轮快速排序的函数:

/**
 * 一次快速排序
 * @param array 数组
 * @param lo 数组的前下标
 * @param hi 数组的后下标
 * @return key的下标index,也就是分片的间隔点
 */
public static int partition(int []array,int lo,int hi){
    /** 固定的切分方式 */
    int key=array[lo];//选取了基准点
    while(lo<hi){
        //从后半部分向前扫描
        while(array[hi]>=key&&hi>lo){
            hi--;
        }
        array[lo]=array[hi];
        //从前半部分向后扫描
        while(array[lo]<=key&&hi>lo){
            lo++;
        }
        array[hi]=array[lo];
    }
    array[hi]=key;//最后把基准存入
    return hi;
}

2) 快速排序的函数如下:

/**
 * 快速排序
 * @param array
 * @param lo
 * @param hi
 */
public static void quickSort(int[] array,int lo ,int hi){
    if(lo>=hi){
        return ;
    }
    //进行第一轮排序获取分割点
    int index=partition(array,lo,hi);
    //排序前半部分
    quickSort(array, lo, index - 1);
    //排序后半部分
    quickSort(array,index+1,hi);
}

3) 测试函数:

public static void main(String[] args) {
    int[] arr = {1,9,3,12,7,8,3,4,65,22};

    quickSort(arr, 0, arr.length-1);

    for(int i:arr){
        System.out.print(i+",");
    }
}
输出是:1,3,3,4,7,8,9,12,22,65,

PS:重庆至臻科技

原文地址:https://www.cnblogs.com/tangzhe/p/9276866.html