https://www.1point3acres.com/bbs/thread-409626-1-1.html
- 一个image以2D byte array的方式储存(byte[][] image),每个象素点是1个bit(0或1)。现在要求每行的象素点做对称翻转。我的做法是先把每行的byte对称翻转,然后再把每个byte各自翻转。
如其中一行byte[] row = {11010100,00101010}
第一步{00101010,11010100}
第二步{01010100,00101011}
时间复杂度是O(m*n*8), follow up如何优化时间,应该是在翻转每个byte上把O(8)的复杂度降低,但是不要求使用复杂的位运算。
没太理解对称翻转,楼主能clarify一下对称翻转的第一步和第二步分别是如何得到的么?
就是每行的像素点(一串0和1)相对于它们的中点对换,比如原来是11110000,翻转后是00001111. check 1point3acres for more.
补充内容 (2018-4-25 08:11):
因为每行的表示是一个byte array,所以第一步是把所有的byte做上述翻转,翻转后的byte array再对每个byte(包含8个像素点)做同样的操作,这样你就把一行的像素点都对称翻转过来了。
第一题是不是可以用个hashmap存一下每个byte对应的反转byte,这样的操作就是128*8 常数
2. game of life变形,一个2D matrix只有0或1,要求把所有上下左右被1包围的1变成0。先给了个space O(n^2)暴力解,然后让优化空间,就说了用两个bit存放前后state的方法,space变O(1),但面试官说假设每个格子只有一个bit空间怎么办?答三行三行做,他说行。
我开始给的O(1)空间的解法就是leetcode上面的,用两个bit表示前后状态(00,01,11,10四种组合)。但是现在他说我的matrix里每一个元素就是个bit,不能用上述方法。可以使用额外空间来做这道题但是尽量minimize,因为每个1只受它上下左右元素的影响,我就用一个3*n的matrix来保存目前处理的这行的上下行和它自己(假设原矩阵是m*n),当处理到下一行时,临时matrix的第一行已经没用了,可以存当前行的下一行,一直往复到最后一行。
3. 面经题,设计一个interface实现有timestamp的hashmap,即(key,value,time),写出get和 put方法。过期的key value pair不能被get。
4. 面经题,给一个国王家的family tree (n-ary tree),王位继承是先传国王最年长的儿子,假如最年长儿子死了,就传给死儿子最年长的儿子。。。如果这些人都不存在,再考虑国王次年长的儿子,以此类推。要求设计这样一棵树,死掉的人不要求删除,实现birth()和输出王位继承顺序的method(死掉的人不在继承顺序结果里)。