兔兔森森面筋

Intern

  1. 一个有序序列有N个数,随机替换其中k个,求复杂度< O(NlogN)的算法使替换后数组重新有序。
    Stack+MergeSort. 可以分成k个sorted list然后merge k list, 也可以找出2k个异常点(发现异常后两个值都拿出来)对2k个排序,然后再和剩下的n-2k个有序序列merge。写完之后给了几个follow up优化了一下
    && coding完之后问了下双向队列底层是怎么实现的,和队列比有啥区别。
    (deque的实现比较复杂,内部会维护一个map(注意!不是STL中的map容器)即一小块连续的空间,该空间中每个元素都是指针,指向另一段(较大的)区域,这个区域称为缓冲区,缓冲区用来保存deque中的数据。因此deque在随机访问和遍历数据会比vector慢。)
  2. 华容道移动,给出棋盘的初始状态和结束状态,求移动的最少步数。
    基本是leetcode773题,只是修改了一下棋盘的大小,变成了4 * 4
    一开始用的是BFS的方式写的,面试官提示了程序中的一点错误,修改了之后问了下优化的方法,正好这学期的AI课程学了一些search的方法,然后就说了下用双向BFS来节省空间,A * 的方法来进一步减少分支。
    然后又问了下这道题用A * 的话使用什么heuristics比较好,回答了对应点的hamming距离之和。之后面试官说A * 的方法就不写了
    解法: A* algorithm, follow up可以在O(n*m)的时间根据奇偶性判断(https://www.cs.bham.ac.uk/~mdr/t ... lesSolvability.html)
  3. lc 233 变种
  4. lc 480的变种。输入是一个数组array 还有一个整数k。10<=k<=array.length. k代表滑动窗口的宽度。需要求每个滑动滑动窗口内的 去掉前10%大和前10%小的数之后剩下数的平均值 并把平均值放在一个数组里返回。【BST是最优解】
  5. 先修课程,类似lc210 拓扑排序
  6. 给一个start string和target string,允许的操作是:每次可以把start string中的全部某个字符变为另一个字符,可以变成“ * ”,但“ * ”只是中间变量,最后还要变到target string。给定两个string返回最小的操作次数,不能变返回-1。力扣好像有类似的我记不清了。
    follow up 1: 给定一个符号"", 字符可以先转换成""再转换成其他字符,
    "abb"->"baa" return true, "a"->"", "b"-"a", ""->"b".
    follow up 2: 没有"*", 不限字符转换次数,即可以先将一个字符转换成中间字符,再对中间字符转换。
    "abb"->"baa" return true, "a"->"c", "b"->"a", "c"->"b"
    求转换次数
Template
int MinOpTimes(string str1, string str2) {
//...
};
Examples
Example 1:
str1: accs, str2: eeec
operation 1: change 'a'->'e'; // str1: eccs
operation 2: change 'c'->'e'; // str1: eees
operation 3: change 's'->'c'; // str1: eeec
return 3;
Example 2:
str1: accs, str2: efec
return -1;
Example 3:
str1: abb , str2: baa
operation 1: change 'a'->'*'; // str1: *bb
operation 2: change 'b'->'a'; // str1: *aa
operation 3: change '*'->'b'; // str1: baa
return 3;
  1. 给一个函数,input是0到9,output是下一步能走的位置一个list,list的范围也是0-9。给定你这个要走K个step和一个初始值(0-9), 问你最后能走出多少种走法
  2. 一个sliding window。给一个数组,求所有k个连续的数当中的最小值。
  3. 一个双向链表和二叉搜索树互相转化
    类似lc109,把双向链表转化为二叉平衡数
    写出了 O(n log n) 的算法,followup 问怎么优化到 O(n),应该是先把二叉平衡数存入数组就可以了。
    用递归,每次找到那个root节点然后对左右子树继续进行递归就好,不过最好先遍历一遍链表,然后用数组存,每次递归传入这个数组和对应的index范围,最后时间复杂度O(N),空间复杂度也是,反向转化的话也是类似思路
  4. 两条线段是否相交,先求交点,然后判断交点范围可解,可以思考的是处理斜率为无限大的直线的时候如何简化代码....
  5. 给一个是通过对BST做BFS得到的一个序列(层次遍历得到的序列),如何判断能否生成对应的BST,有点类似lc255,返回true or false。
    思路是用queue存当前可以插值的范围,依次遍历序列里的值,如果queue前端的范围不合适就pop,合适的话将该范围扩成两个新的范围push进队列末尾。如果queue为空就return false。Follow up是返回构造的BST, 这个很简单,只要用queue存pair<pair<int, int>, TreeNode*>>就行了,插入范围的时候判断是插在左孩子还是右孩子。
  6. 给了一个字符串,包含了若干大写字母和小写字母,然后要求将字符串的小写字母移到字符串的前面,大写字母移到字符串的后面,顺序无所谓。感觉好像还是leetcode的原题,但是没有找到。
    用了两个指针来做,第一个指针遍历整个字符串,第二个指针记录index最小的大写字母,每次遍历到小写字母的时候,如果index大于指针记录的大写字母的位置就交换,然后再去找下一个大写字母。
    感觉有一点brute force,可能还有更好的方法吧。然后问了下复杂度,因为两个指针的位置都是递增的,所以应该是O(n),然后又问了下认为哪些test case比较好,随便说了一下就结束了。
  7. 给了一列数字,要求返回每个数字的左边的最后一个比他大的数字的坐标,如果没有就返回-1。例如5 4 2 1 3,就返回-1 0 1 2 1。
    有点类似leetcode的739题,主要是用stack来解决。一开始是用的顺序遍历来做的,然后面试官给了一个反例,想了一会就在面试官要提示的时候想出来应该逆序来操作,然后改了下代码写出来了。
  8. lc207
  9. 比如abcdabefexy分割成abcdab efe x y,和其他的子字符串没有重复字母,思路就是存每个字母最右边的index,然后遍历数组,不断扩大右边界,如果发现合法字符串,就截断
  10. 平面上N个点,找出所有的正方形,时间复杂度越低越好。
  11. 实现一个fixed size的queue. 输入是queue的size,需要实现push pop两个方法,push的时候假如queue已经满了的话需要pop队首,只能用基本的数据结构实现,比如array, linkedlist。
    楼主先说要用linkedlist做,面试官问楼主为什么不用array,然后讨论了下array和linkedlist实现的优缺点,最后在面试官的要求下采用array实现。 代码写完后,面试官看了没问题后,问了几个followup,首先问了下我多线程的问题,就是假如queue需要支持多线程,需要怎么做,楼主说用读写锁,写了加读写锁的代码。问了下什么是reentrantlock,多线程问完后,又问了下如果queue要支持扩容和压缩该怎么做,就是相当于resize怎么实现,讨论完后写了代码
  12. lc857
  13. lc996
  14. lc361
  15. 给一棵树,节点除了左右孩子指针还有邻居指针用来指向右边第一个非空节点,给一棵树的根节点,需要把每个节点的邻居节点值都赋上,用来指向别的地方
    一开始给了个bfs的解法,follow up是把space优化到O(1),我是利用遍历邻居指针继续对下一层的节点做相应操作。
  16. 给一个tree的preorder traverse的数组,问是否是valid tree
  17. lc76
  18. 字典树
    字符串匹配1 : 正常版 =>KMP/RK
    字符串匹配2 : 模版串可以shuffle (abc 可以匹配bca)
    字符串匹配3 : 模版串可以shuffle + mapping (abc 可以匹配321 abc => cba => 321)
    字符串匹配4 : AC自动机
  19. 给n个点和m个区间,一个点最多匹配几个区间 问最多匹配几个区间和点 : 堆+扫描线 需要证明正确性 貌似用二分图?
    给n的点形成一条折线,求k等分点 : 二分
  20. 多线程知识 + 实现多线程队列 + OS
  21. 有n个object 两两之间可以有三种关系(相同种类1,不同种类2,不知道2) 给m个三元组(object1, object2,relation 1/2/3)假设不存在矛盾 求问给定一些二元组(object1,object2) 输出他们的关系
    A B 1
    A C 1
    A D 2
    C F 1
    D E 2
    则输出 B D => 2 A E => 3 A F =>1
    并查集建点(same relation) + 图遍历建边(different relation)
  22. 给你一个字符串,你可以增加或者删除,要尽可能的balance,也就是和原来的字符串要尽可能的相似,你要怎么做(这里我们认为添加是+1 删除是-1 然后想办法让操作完之后接近0),要返回回文字符串
  23. 就是n个点在2D平面上,return k等分点的位置并返回。基本就是presum
  24. 有n枚硬币,每个硬币掷一次正面朝上的概率各不相同,假定第i个概率为pi。如果把所有硬币都掷一次,求k个硬币正面朝上的概率。
    一开始想的是DFS,面试小哥说复杂度太高了,后来想到用DP。然后被问复杂度,follow up是问空间复杂度怎么优化到O(n)。
  25. 很简单的二叉树题,判断树的所有节点value是不是都相同。
  26. 给一个都是1和0的数组,比如说[1,1,0,0,1,0],和一个integer n,你可以选任意0到n个0变成1,求变完以后最长连续1的长度。比如这题如果n是2,答案就是5。followup就是只能连续变。
  27. 给array of integers, 裡面有一个数字是单独出现 其他都会出现两次(而且一起出现)
    ex: [1,2,2,3,3]
    要判断哪个数字是单独出现的
    以这个例子的话就是 1
    LZ 一开始先说了用HashMap 去记出现几次, 面试官说有没有不用额外空间的方式, 我说 那就用XOR 去算吧 剩下来的那个就是单独出现的了 複杂度是O(N), 面试官说可以,但是希望再想其他方式可以优化的 比如说O(logN)複杂度. 看到logN就想到binary serach了,不过一时没有想到怎麽个search法,面试官给了提示才推出来的,结论就是用index是基数或偶数 来判断 search砍半时应该往前找或往后找 (多找两个例子就可以看出来了),然后是一些corner case的讨论, 最后写case直接跑 面试官说想看看面试者会怎麽想Case验证这个solution
  28. 考binary tree
    给你一棵树 问是不是uniform tree (也就是 整棵树的值都一样)
    follow-up: 问这棵树有几个subtree是uniform tree
    两题都是divide & conquer recursive写的
  29. 给一个数组 裡面只有 0和1
    问最少次数把0换成1 或把1换成0 可以让 0都在左边 1都在右边 (或者0都在右边 1都在左边) [0,1,0,1]的话就是把第一个1换成0 可以达到分边
  30. 给定N,请通过从小到大输出,分母不超过N的真分数序列。比如给定5,就输出1/5,1/4, 1/3,5/2,....等
    先开始想了一个用PriorityQueue的算法,因为不超过N的序列中,以分母归类,以n=5为例,
    1/5 2/5 3/5 4/5
    1/4 2/4 3/4
    1/3 2/3
    1/2
    首先把每一行的第一个元素加入PriorityQueue,再poll出来,poll到的数用一个指针往后移动,这样时间是O(nlogn)。
    后来面试官给提示说,这其实是一个从左到右,从上到下都递增的序列,每次只需要比较右边的和下边的谁大就可以了。
  31. 一个4*4的棋盘,O代表空位,X或者Y代表棋子。每次可以移动一步,求问最少多少次可以移动至胜利。胜利的条件是,存在排成一列的或者一行或者一条斜线的X(或者Y)。
    OXXY
    XOOY
    XXXY
    YYOO
    我先说了DFS,后来觉得应该是BFS,通过Hash值来保存棋盘的状态。
  32. 两堆石子(m,n),两个人A和B,每次只能取(0,k)或者(k,0)或者(k,k),其中k<=min(m,n)。求问如果A先取,A有没有必胜策略。
    首先想的是迭代,边界条件是如果m=n,那么A必定赢了。
    初步的想法是,f(m,n) = f(m-k,n-k) || f(m-k,n) || f(m,n-k) 等等 0<k<min(m,n)
    时间复杂度是3的min(m,n)次方。
    后来又说能不能提升复杂度,想到了记忆化搜索。但是最后面试官说可以达到O(m)的复杂度
  33. 假设有很多张图片,图片之间有遮挡关系,找到最底层的图片
    follow up1:假设所有的图片都是矩形,给你俯视图,如何找到图片之间的遮挡关系,提一下就好,不用写
    follow up2:给出一个possible的从最底层到最外层的图片顺序,就是topological sorting,因为我当时时间还够就写了一下
  34. lc28
  35. lc20
  36. 有n个城市,每个城市之间可能有路径相连,如果有路径,这个路径会有一个weight,代表的是最大能够承受的车的重量,另外有不同重量的车,能走的路不能超过最大承重,每条路通过路费1元,预算k元,写函数求能够从s开到t的车的最大重量。follow up,如何优化
  37. lc4
  38. lc44 wildcard matching中的字符串改成多级文件路径,每一级的*都只能作用于这一级,判断两个路径是否match
  39. 一个数轴上,有n个点(x1,x2,...,xn)和m个区间(a1_b1),(a2_b2),...,(am,bm)。每一个点只能匹配一个区间,每一个区间也只能匹配一个点。匹配的必要条件是点包含在区间之内
    也就是对于(ai,bi),当ai<=x<=bi时,可以进行匹配,当然也可以选择不匹配,把这个区间让给其他的点。求最多可以有多少个区间被匹配到。
  40. 貼了Hashmap的Class和希望我實現的constructor/destructor/function大約10個
    然後強調主要想看我先寫如果Hashmap要resize的部份怎麼實現
    剩下部分就盡可能在時間內寫完,寫多少就是多少
    大致上就是已知:
class Key{
...
};
class Value {
...
};
實現以下:
class Hashmap {
    Hashmap();
    Hashmap(int capacity);
    Key* getKey();
    bool resize();
    ...
};
  1. lc 215,但是不能用priority queue,必须用quick sort来写,利特扣得上有答案我就不多说了. 1point3acres

  2. lc53,这是个easy题很快就写好了,但是followup是找出两个subarray,使他们sum最大,这里我用的是两个数组保存每个位置左边的maximum subarray和右边的maximum subarray。然后找两个数组对应位置sum最大的就行了

  3. 给文件列表List<File> files, 实现一个gitignore, 可以过滤掉gitignore里出现的文件,需要满足gitignore的规则。
    gitignore规则:
    如果是,则表示同通配0个或者任意字符。比如 /path/to/file。/path/to/abcdefile满足(任意),/path/to/file满足(0)。
    如果是?,则表示通配一个字符。比如/path/to/?file。/path/to/zfile, /path/to/xfile等满足。
    如果是[],则表示满足括号里的任意一个字符。比如/path/to/[abcde]file,则/path/to/afile, /path/to/bfile等满足。
    重点是,“/”不能匹配

  4. 给一个pixel matrix,matrix可以理解为照相得到,不同颜色的pixel组成不同的广告牌,判断广告牌之间的遮挡关系 如下
    [1,1,1,1]
    [1,1,2,2]
    [1,1,2,3]
    不同的数字代表不同的颜色。例如此表示有
    [1,1,1,1]
    [1,1,1,1]
    [1,1,1,1]
    [2,2]
    [2,2]
    [3]
    求距离最远的广告牌的颜色。

  5. 给定一个BST。implementBST节点的get_weight方法,其中weight定义为此二叉树中value大于此节点value 的其他所有节点的最大深度
    input:
    5
    / \
    3 7
    / \
    1 4
    返回
    2
    / \
    3 -1(因为7为最大)
    /\
    3 2

  6. 题目是给一个N-ary tree,如何将其转化为一个二叉树?
    转化规则为左孩子,右兄弟,就是左儿子不变,右孩子变为自己右侧最近的那个非空兄弟。
    follow up:任意给一个二叉树,可以还原成N-ary tree吗?如果不能,满足什么样条件的可以呢??
    原题我是用hashmap+level-order traversal做的,然后follow up是不能,需要满足根节点没有右子树且其任意节点的右儿子深度不超过N,第二个条件我开始也没想出来,我可能表达的也不是很准确,其实就是root = root->right,然后直到null停下来,这个深度不能超过N,因为子节点数量有限。

  7. lc907

  8. merge k binary search tree

  9. 给定若干点坐标,连成折线。要求将折线长度k等分,返回等分点的坐标数组列表。

  10. 给一个正整数集合,求一个和最大且能被3整除的子集。Follow up: 如果集合里有正有负,怎么做。

  11. lc136 变体,如果出现两次的数总是相邻的,有没有比异或一遍更高效的做法。

  12. 钥匙

Full-time

  1. 有哪些常用的数据结构
  2. Map 和 HashMap的区别是什么,内部都是怎么实现的
  3. Implement a fixed size queue, 支持pop(), push(),如果超过capacity就直接return false
  4. lc 武士流
  5. followup:给两个Array of intervals, 每个array内部是无序的,也可能有overlap。求这两个array所覆盖的区域之间有没有overlap
  6. 给出Union tree的定义:自己和所有child的value都一样。求一个tree里面有多少个union tree,比如以下这个就有6个:
    1
    1 2
    1 1 2 2
    除了顶点的1以外,以其他点为顶点的tree都符合Union tree
  7. 同样问了Map和HashMap的实现,并问了HashMap的地址冲突的解决方案。还问了当HashMap中的地址冲突是用开放地址法解决的时候,删除一个key时的操作
  8. 合并n个BST。讲了讲我的设计,并问了时间复杂度,没有让我写代码,只让我写了一个TreeNode to array的函数。
  9. 给出tree的一个节点的weight的定义: the biggest depth of nodes whose values are greater than A。求一个Tree的每一个node的weight值
  10. 给一个N-array Tree (Undirected graph), 找出最长的路径。不一定要从root开始。Node没有value,edge有value。
  11. leetcode 935
  12. 给无向图判断是否能成二叉树
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 这个不错分享给大家,从扣上看到的,就转过来了 《电脑专业英语》 file [fail] n. 文件;v. 保存文...
    麦子先生R阅读 6,546评论 5 24
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,323评论 0 2
  • 我卖了这么多年假药,发现这世界上只有一种病—穷病。这种病你怎么治,算了吧。 这是假药贩子张长林对程勇的一句话。我们...
    王奕森阅读 760评论 3 5
  • 寒夜玉花悄至, 庭前灯火两三。 遥现佳人回眸笑, 冰肌玉骨画中人。
    邵主阅读 133评论 0 0
  • 心理咨询中没有咨询目标是致命性问题,一般解决疑惑的谈话虽不是心理咨询,其实也需要确定一个谈话目标,否则说了半天鸡同...
    王明鹏阅读 649评论 0 5