(G) Design / OOD 类算法题
非常的 trivial ... 用一个 hashmap 做一个类似 inverted index 功能就可以了,需要注意的地方是如果这轮输出了 true,要同时更新 hashmap 里面的 timestamp,输出 false 的时候不更新,因为还没 print.
public class Logger {
HashMap<String, Integer> map;
/** Initialize your data structure here. */
public Logger() {
map = new HashMap<String, Integer>();
}
/** Returns true if the message should be printed in the given timestamp, otherwise returns false.
If this method returns false, the message will not be printed.
The timestamp is in seconds granularity. */
public boolean shouldPrintMessage(int timestamp, String message) {
boolean rst = false;
if(!map.containsKey(message) || timestamp - map.get(message) >= 10) rst = true;
if(rst) map.put(message, timestamp);
return rst;
}
}承接了 sliding window maximum 的灵感,维护一个所谓“固定大小”的 sorted deque,两端操作,从 peekLast() 开始看,小于当前起始 time interval 的就直接扔掉,也完全可以处理同一时间多个 hit 的情况。
不过貌似这写法速度不够快,126ms,只超过了 17.46%,一看论坛上快的解法都是用 int[] + circular buffer 的写法。
Follow up:
What if the number of hits per second could be very large? Does your design scale?
建 int[] array 显然就不现实了,不如 deque !
这题的 index 用法其实和 N-queens 的备忘录法一样,存行,列,各个对角线就行了。
看了下论坛,这题还可以进一步做空间优化,利用只有两个玩家的特点省掉一半空间。
先用 Deque 写了第一版,速度只超过了 2.35% .. 可能我每步都调用 String 复杂度太高了。
需要注意的细节:
food 吃完之后还可以继续玩,蛇每次依然在动,所以要在合适的地方 access food matrix 免得越界。
吃自己身体会 game over,但是吃尾巴尖没事。。
用了另外一个 deque 存 body index 速度就快多了超过 54%, 但是没什么大改动就不贴代码了。另外一个小改动是,其实用不着存 score 变量,因为 score = 蛇长度 - 1
一个典型的 Observer pattern;为了降低耦合度,每个 user 维护自己的 tweet list 和 follow list,而 post tweet 只是负责自行生产,而不主动执行 push; 每次刷新的时候自己从 follow 列表抓 tweets 就好了。
这题一个需要注意的细节是,排序顺序是按照 timestamp,接口里给的 tweetId ,和时间顺序没有必然的联系,所以要自行维护全局时间戳。
除此之外就是比较直观的 merge k sorted list 问题了,为了方便处理,我们维护了一个 Tweet object 的 LinkedList,但同时 Tweet 存了一个自己的 prev 指针,方便进行多路归并的时候正确找到下一个元素。
其他需要注意的就是各种 corner case : 关注自己,取关不存在的人,取关自己本来就没关注的人,自己或者自己的关注用户没有任何 post,等等。
我还以为要写个 trie 什么的。。这题是什么鬼。。写个 boolean[] 都能 AC.... 697 ms 好么。。
下面这个代码的 get 时间复杂度为 O(maxNumber),显然太高了。
稍微快一点的做法是,用一个 Queue 维护目前所有空位,用 Set 维护目前所有已经使用的电话号码。主要 overhead 在于初始化的时候要花 O(n) 时间建队列,还有在 HashSet 里面做删除操作。
这种做法是靠均摊复杂度平摊 cost 的典型例子。
这题的另一种比较省空间的做法是用 BitSet,就看对 API 的熟悉程度了。
bitset.nextClearBit(smallestFreeIndex);
bitset.clear(number);
bitset.get(number) == false;
bitset.set(smallestFreeIndex);
(G) Design Battleship Game
(G) Design Elevator
(A) Design Parking lot
(LinkedIn) Data Stream as Disjoint Intervals
Last updated
Was this helpful?