有趣的面试题

1.A、B两人分别在两座岛上。B生病了,A有B所需要的药。C有一艘小船和一个可以上锁的箱子。C愿意在A和B之间运东西,但东西只能放在箱子里。只要箱子没被上锁,C都会偷走箱子里的东西,不管箱子里有什么。如果A和B各自有一把锁和只能开自己那把锁的钥匙,A应该如何把东西安全递交给B?
答案:A把药放进箱子,用自己的锁把箱子锁上。B拿到箱子后,再在箱子上加一把自己的锁。箱子运回A后,A取下自己的锁。箱子再运到B手中时,B取下自己的锁,获得药物。

2.有一个软件公司,1/2的人是系统分析员,2/5的人是软件工程师,有1/4的人两者都是,问有多少人两者都不是?
1 – 1/2 – 2/5 + 1/4= 0.35

3.有25匹马,速度都不同,但每匹马的速度都是定值。现在只有5条赛道,无法计时,即每赛一场最多只能知道5匹马的相对快慢。问最少赛几场可以找出25匹马中速度最快的前3名?(百度2008年面试题) 阅读详细 »

JAVA笔试题汇总

1、进程和线程的区别
2、为什么非主键索引会降低更新速度,提高查询速度? 
 
 
 
===========================Answer=============================
1、进程是程序的一次执行,线程可以理解为进程中的执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:    进程间是独立的,这表现在内存空间,上下文环境;线程运行在进程空间内。 一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。同一进程中的两段代码不能够同时执行,除非引入线程。 
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。 线程占用的资源要少于进程所占用的资源。进程和线程都可以有优先级。 在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
2、非主键索引需要在数据表本身的存储空间外额外开销存储空间,所以在更新的时候可能不仅要更新数据表本身,还要更新非主键索引,更新内容更多了,所以导致速度降低。反过来,如果数据表中的数据按照主键索引的顺序存储,更新的时候就没有额外的开销。 
非主键索引对提高查询速度来讲,主要的方面是:检索的条件(where…)如果命中对应的非主键索引的话,就不需要对数据表做全表扫描,效率肯定是大大提高。 

Linux Shell笔试题汇总

 

1、要求用shell分析Apache日志access_log,要求列出当天访问次数最多的IP,下面是典型的访问信息的log。用shell列出访问最多的20个ip:
 
180.168.41.175 – - [23/Aug/2011:14:47:37 -0400] "GET / HTTP/1.0" 200 654
216.35.116.91 – - [23/Aug/2011:14:47:37 -0400] "GET / HTTP/1.0" 200 654
124.90.136.42 – - [23/Aug/2011:14:47:37 -0400] “GET / HTTP/1.1″ 200 44
 
=========================Answer=========================
1、awk -F  '{print $1}' access_log  |uniq -c | sort -rn | head -20
     或:cut -d- -f 1 access_log |uniq -c | sort -rn | head -20
原理:
       cut
       -d, –delimiter=DELIM
              use DELIM instead of TAB for field delimiter
              表示用-分割,然后-f 1 
       -f, –fields=LIST
              select only these fields;  also print any line that contains  no
              delimiter character, unless the -s option is specified
           表示打印第一部分,就是ip
 uniq 是将重复行去掉, -c表示前面前面加上数目,
       sort -rn 就是按照数字从大到小排序,
       head -20取前面20行
       
         最后打印的结果大概是这样:
                   217 192.114.71.13
                   116 124.90.132.65
                   108 192.114.71.13

 

Java设计模式教程(一)——模板方法模式(Template Method)

模板方法(Template Method)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在内容上存在变数的环节。

结构:

1) 抽象类(Abstract Class):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。
2) 具体类(Concrete Class):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。

abstract class Meetting {
    public abstract void task();

    public abstract void howGo();

    public void goMeetting() {
        System.out.println("准备开会去哦!");
        task();
        howGo();
        System.out.println("开会结束,我要换回公司了!");
    }
}

class PersonA extends Meetting {
    public PersonA(String name) {
        System.out.println("我的名字叫" + name);
    }

    public void task() {
        System.out.println("老板让我去总公司汇报财政情况");
    }

    public void howGo() {
        System.out.println("我搭公交车去总公司开会!");
    }
}

class PersonB extends Meetting {
    public PersonB(String name) {
        System.out.println("我的名字叫" + name);
    }

    public void task() {
        System.out.println("老板让我去总公司提货物");
    }

    public void howGo() {
        System.out.println("我搭公交车去总公司开会!");
    }
}

public class AttendMeetting {
    public static void main(String[] args) {
        Meetting person;
        person = new PersonA("A");
        person.goMeetting();
        System.out.println("");
        person = new PersonB("B");
        person.goMeetting();
    }
}

适用情况:
1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可
以说是一种好的编码习惯了。
3) 控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。

面试前需要准备的五个步骤

 

一、开门见山

一般来说,你(求职者)在面试中会花很多时间谈论以前的经历。如果你还没有想出你的最具代表性的经历/案例,那么你现在是时候该做了。下面有张问题 表,虽然很多问题看似比较低级,但相信我,看完这些问题后,你应当反思自己。即便面试时没有碰到类似这张列表上的问题,你在面试也可以用上已准备好的答 案。

1. 说说你自己吧

2. 你的短期目标是什么?你2到5年内的目标是什么?

3. 你的愿景/使命是什么?

4. 你想从这个岗位中学到什么?

5. 你为什么认为自己能胜任这个岗位?

6. 除了这个岗位,你还在找哪些岗位?

7. 你有什么样的管理或领导经验?

8. 你有什么样的团队工作经验?

9. 你最满意/不满意的经历是什么?

10. 你的强项/弱项是什么?

11. 你最擅长处理哪一类的问题?

12. 你是如何减压?如何平衡工作和生活?

13. 如果他人提出的要求有违你的道德准则或商业道德,你怎么处理?

14. 你上次试图向他人出售点子有什么样的结果?

15. 你为什么要应聘我们公司?你对我们公司了解多少?

16. 你认为加入我们公司有什么样的利弊?

17. 你最看重雇主的哪一方面?

18. 你过去遇到的主管有哪些共同点?

19. 如果要在竞争中保持领先,你认为我们公司的员工最需要哪些品质?

20. 你最喜欢/不喜欢什么课程?为什么?

21. 你的兼职/暑假/实习经历中有什么收获?

22. 你有什么样的深造计划?

23. 为什么你的成绩这么低?

24. 你是如何打发空余时间的?

25. 如果我让你的朋友们描述你,你觉得他们会怎么说呢?

26. 什么事最让你沮丧?

27. 你上次在工作中遇到恼火的事是什么时候?结果如何?

28. 你如何提高你的整体效益?

29. 去年你遇到最艰难的决定是什么?为什么它很艰难?

30. 你为什么到现在还没有找到工作?

31. 你在哪些方面没有任何经验?比如:销售、筹款或者簿记。

32. 我们为什么要雇用你?

上面这个列表中的问题需要深思和反省才能回答,所以在下一次面试之前很有必要提前想一想。有些问题可以有相同的答案。如果问题答案需要讲述一段故事/经历,你可以按如下方式来做:

1. 20秒描述情况。“代码出问题了,整个团队必须找出原因。”

2. 30秒描述你做了什么。“我认为是内存溢出,我注意到AbstractMemberCreationFactory本应该只有一个实例,但它有很多实例”。

3. 20秒描述结果。“我用一行代码解决溢出问题,我们的产品如期上线。后来,我都会先测试确保不会再有类似问题”。 

在每次面试前,浏览整个列表并大声练习你的回答。这样做让你在面试中更加轻松自如,你就比其他应聘者有更多的优势。比如,当在回答问题时,其他应聘者可能会先看着天花板说“嗯”,然后开始回忆过去5年中发生的一切。而你则可以微笑地看着面试官的眼睛,再陈述你的答案。



二、事先练习最常用的编程算法,以建立自信

钢琴家在达到下一级水平之前,他们必须先学习一套短曲。这些短曲虽然不曾在聚会上弹奏,但他们要练习特定的部分,比如右手小指和切分音。同理,尽管有些算法你或许没有在你的代码中用过,但它们经常在编程面试中出现。比如:

1. 反转单链表;

2. 反转字符串或反转段落中的单词顺序;

3. 利用星号输出画一个任意大小的圆;

4. 整数转换为字符串,数字型的字符串转换为整数;

5. 写一个函数,返回任意整数对应二进制形式中的“1”的个数;

6. 写一个函数,输出字符串中字符的所有排序。(比如:abc acb bac bca cab cba)

一般来说,可以先不考虑算法的运行时间,都是先用最简单有效算法。然后再尽量减少运行时间。能让算法正常跑起来,总比你花大量时间想一步到位要好。(一步到位的想法虽好,但大部分时候都是事倍功半。)



提示:做练习时,别自欺欺人看答案。

我第一次写“反转单链表”算法是利用课间时间。我并不急,从运行时间较长的方案到优化的方案,我用了半个小时。在验证算法正确无误后,我非常高兴!我知道不看答案我也能解决问题了。(建立自信了!)在面试中,当遇到从未见过的问题时,我以前的经验给了我信心。



三、练习解决问题能力



有些应聘者认为能解决脑筋急转弯问题就有良好的编程技能。如果你也这么认为,那你应当培养猜谜这方面的兴趣和技巧。你可以去图书馆或在网上找这方面的书。然后,挑一些有趣的问题,先别看解答。如果半个小时之内还想不出答案的,才可以查阅解答。



第四、展现出真正的热情



另一个技巧就是要把真正的热情展现出来。作为人,我们应该真诚和热情与他人共处工作。另一方面,我们也要有看穿虚假笑脸的能力(没有这种能力,也需要锻炼出来),所以活出真我很重要。



最优秀的面试官会让你讨论一些你非常热衷的事情,即使有些些事和你所应聘的岗位没有直接关系。然而,大多数面试官却没有这么做。虽然如此,你还是应当 好好考虑那些你非常感兴趣的事,并且要抓住机会来和面试官讨论一番。如果面试官允许的话,一定要在面试过程中的前段时间内完成,如果能在第一时间展现出来 更佳。面试开始10分钟后的效果可能就不怎么样了,因为面试官已经给你打分了。



想象一下:你第一天去新岗位工作,转向新的开发平台,遇到一些有趣的新朋友,并且了解了公司的生活。(总之)在公司中会有很多让你兴奋的事,要不然,你为什么去应聘呢?



五、睡眠/休息



如果你缺觉的话,“舌尖现象”则会急剧上升,导致你在面试中就不能很好回忆事情。所以,面试前必须有个良好的睡眠。