2014年6月12日星期四

ebay 电面



iq350推荐的,感谢一下!面试的是个国人大哥,sort linked list,正好是我刷
leetcode时几个觉得特别烦的题之一,临时想的,用的quicksort,递归时估计有问题
,还没test到递归就到时间了,应该是挂了。。顺便问下,这题算是啥难度?是不是我
太菜了

滚烫烫的G店面面经


刚面的。 第一轮店面。

面试官是白人geek来自安卓组,以前是earth组的。 貌似不知道该怎么开始面试。

1. high-level questions
进程与线程的区别
当只有单核时,用多线程有什么优缺点
什么是好的软件设计开发pattern或者行为
谈谈你见过的最好的设计是什么


接下来就是设计题的实现:

class EventCounter{
public:
     //registers a single event
     void Increment() ;

     int getLastSecondCount();

    int getLastDayCount();
};

题目要求是假设有一个webserver,这个EventCounter 类被这个webserver调用以得到
网站返回错误信息event的计数。

要求实现这三个函数。

貌似是以前老题吧,我自己没有认真考虑过,答得一般估计挂啦,完全不是算法的路子
,这种开放式题目实在是自己的弱项,有什么好办法可以提高?  thx


--------------------

线程在单核时候可能会被blocked
多线程在这个时候会自动绕开被blocked的线程,导致整体process不会停滞
好的设计pattern就是你不需要去阅读代码就能明白对方在做什么
如果需要阅读代码,那么会有一个先入为主的idea,指导你对方在做什么
这样可以大量节省时间,提升你阅读代码的速度
最好的设计,这个就是纯粹聊天题,看你知识深度和广度,随便聊

------------------------

最后一题是多线程的并发处理题
还是跟topk一样,建heap,priorityqueue
这题涉及到多线程并发,priorityblockingqueue
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/P

EventCounter这题可能不需要建heap
heap有点overkill了,用concurrenthashmap这种应该效果更好



如果用了synchronized的class的话,这题就不用synchronized关键字了
这题想办法处理好多线程的并发冲突就好了
最简单的就是synchronized关键字,但是这个效率偏低
用concurrenthashmap就快很多了,再启一个线程,对每过去一秒的计数可以做
persistence
随便找个db存一下就好了,内存db都可以,java可以用javadb或者redis都可以
android就用android自己的sqllite,然后倒数第二个函数就纯粹是去db里面query了
倒数第一个函数就是instant data的查询,这个可能要用到atomicinteger这种原子操
作的类
如果你自己额外建一个计数器的话,但是这样做还是会blocked,最好是操作hashmap
然后再异步去那个atomicinteger里面做加加减减
都是多线程的那些思路,这些题其实并不侧重设计
只是多线程这些多多少少会涉及一点设计罢了
这种题好处在于,对方通过问这种题可以把底摸个透
【 在 csiscoder (csiscoder) 的大作中提到: 】
: 怎么把blocking queue用到这个问题上呢? webserver是怎么调用这几个函数呢? 如
: 果现在的时候不是一天的结尾,怎么得到过去一天的count呢? 如果服务器不是每秒钟
: 更新错误信息event的计数,怎么得到过去一秒钟的counter呢?应该存储什么数据呢?
: 用什么数据结构存储,以及计算该如何做呢? 如果是多线程该怎么处理呢? 我觉得这
: 些问题我都没有办法相处非常好的答案,尽管是open ended,能否指教指教?多谢


多线程的2个好处:
1, UI响应快
2,有些blocking的处理,比如网络传输,用多线程可以加快。

参考C++ Concurrency in Action: Practical Multithreading

http://www.amazon.com/C-Concurrency-Action-Practical-Multithrea

应该说用spark/storm,立马onsite

第二题就是 一个 circular array 吧? one array with 86400 counters, extra
counter for day counts. you probably do not even need a lock as numbers can
be atomically incremented.

zhaoce 大牛光知道胡侃。

concurrenthashmap底层就是一个array,所有的hashmap底层实现都是一个array
所有的hashcode算法都可以做成consistent hashing,也就是circular array
用concurrenthashmap的好处就在于,如果发生了冲突,这个轮子可以自动帮忙调节
而不需要自己去从底层实现,效率快很多,而且automic increment这个很容易写错
需要知道哪些是原子操作,哪些不是,一般简单的i+1这种就不是原子操作
synchronized关键字是要避免使用的,会是好事,但是不太容易维护,太容易错
在多线程并发的时候,很容易出错,这题是去年常考的题目的变种,更简单了一点
一开始题目并没有说要多线程




这题就是writer间的同步问题,都不用考虑reader, getlastSecCount()读的都是历史
数据啦。

Java 5 java.util.concurrent.atomic provides wrapper classes for int and long
that can be used to achieve this atomically without usage of
Synchronization

AtomicInteger 典型use case.