You are on page 1of 9

Yahoo Onsite

● 非LC算法
● 高频
● Find median in unsorted array | x3
● 手写Merge Sort | x2
● Friends of Friends | x2
● 1
● https://tinyurl.com/y9lnzurb
● Friend of Friend. 大概意思是给一个map {A : [B,C]} 表示 A有朋友B,C. 这时候 假
如有 {B: [D,E]} 则输出 {A,D}, {A,E}

● 2
● https://tinyurl.com/ybpns6ex
● 第三轮问了两个算法题,第一题是给你一些用户和对应的好友,要你输出所有共同好友
的列表。举个例子,{a:[b,c,d], b:[a,d], c:[a], d:[a,b]}, 输出 {(a,b):[d], (b,c):[a], (b,d):[a],
(a,d):}. 其实很简单,有点像倒排索引,一个loop,用tuple当作key建字典就行。

● recursively and iteratively 判断一个string是不是palindrome,秒之


● find if negative element exists without using less than
● Implement Link List and Insert/Delete operation
● 给了一个heap,怎么调整顺序成为min heap
● Given an BST, remove all nodes less than a given value. Need to preserve the tree shape.
● - Use preorder.
● - Combine with inorder to achieve better time. 1p
● give two unsorted arrays a[] and b[]. each entry is sum of a[i] + b[i]. Find the first K sums in
ascending order
● 给一个sort好的数组,要求返回原数组sort好的平方数数组
● https://tinyurl.com/y7rql65f
● 扫地机器人:
● 一个二维数组,再输入一个机器人的位置,可以走四个方向,二维数组有些地方代表有脏东西
,有的代表障碍物,让你用机器人把房间清干净。简单的DFS搞定。
● 给你三个长度d,l,s。让你用l和s组成d, 返回可能不可能。先backtracking写了,时间复杂度有
点儿高,然后又写了dp版本
● 一个乱序数组,两个player,可以从第一个或者最后一个位置取数字,然后删掉。player1 先开始
,问player1能不能赢。
● https://tinyurl.com/ya4bl63k
● dictionary 里 ['','a','ab','abc','abcd‘~~]
● 找到最长的从''->'a'->'ab'->'abc'-----
● dfs 但是三哥急不可耐的说,character 可能是特殊的不是'a'-'z',还没开始回答,说了句
trie也可以做。三哥立马不管特殊character,直接让写trie, 然后dfs trie..

● https://tinyurl.com/y9lnd6bo
● 给你两个String, 按照第二个string里面character的顺序排序第一个string,第一个string如果没有
第二个string的character就跳过, 然后最后在append第一个string有的第二个string没有的
character
● https://tinyurl.com/y8qc4wbe
● 给一个巨大的数组 无法直接载入内存 找中位数如何做
● LZ答可以使用外部排序 切成几块分别排序 载入内存后用k路归并解决 大叔问如何k路归并
LZ直接给了priority queue的写法 记录count的数量 然后不断pop 大叔表示ok 接着问假设所
有的数都可以一次载入内存 除了priority_queue 是否有其他答案 LZ给出了Quick Select 分析
了两种的时间复杂度

● https://tinyurl.com/yclrb6ff
● 给一个data stream,里面都是每秒钟的温度信息。要求实现三个function,getAverage(),
getMax, getMin()。最后时间有限,只让我实现getMax().
● https://tinyurl.com/ybgstacy
● Data structure to represent a large number of ip addresses. Require amortized O(1)
lookup time.
● - HashSet is ok
● - Trie is better

● https://tinyurl.com/yb3dvkuv
● 第一轮三姐, 给一个String“yhaoosiunf”,和词典dic“yahoo”,"fun","is",out put "Yahoo is
fun". Input string内部单词作为一个整体是有序的,但是单词内部是乱序的,要我根据给的词典将
乱序的单词变成有序。需要现场编译运行。这题的关键在于两个单词的mathch函数,比如 is 和
si需要被认为是一样的。我的解法是用质数编码26个字母,然后每个string的number等于对应的
质数相乘。我调了三次bug通过testcase。 期间很尴尬的是忘了质数用英语怎么说。这题的follow
up是如果有duplicate怎么办。 比如 sithsi 即可以是 is this 又可以是 this is。 最后没时间做这个
follow up了. follow up其实就是寻找all posiible solution, 用dfs 就可以解。
● https://tinyurl.com/y7k45s56
● 第二题是给一个4位数字将第二大的值改成第一大减第二大的值,比如9724变成9224这样
● 之后的印度小哥哥问了个拓扑sort的题目,给你一串字符串"ac","ba"等等这样,找出来是否有一定
的规律,比如a一定在c前面,c一定在a前面这样。我用了bfs的拓扑sort,复杂度O(n+m)。然而他
说复杂度不对。后来问了bfs和dfs啥时候用。
● https://tinyurl.com/ybkqzh3c
● 類似maze 給一個board 判定能不能search到一個string. visit 1point3acres for more.
● ex.
● aaa
● bbb
● ccc
● search('aaa') -> true
● search('abc') -> true
● search('aaaa') -> true
● 每次search可以有八個方向移動(上下左右和diagnal)
● https://tinyurl.com/yajrktbn
● 第二轮:给一个链表包含各种request,其中有一个request被呼叫次数占所有呼叫次数的50%以上
。把它找粗来。
● https://tinyurl.com/y8tfdtb2
● 给一个数组 代表每个元素的数量 另一个数组 代表每个元素占的百分比 指定一定容量的空间 按元
素占比分配这些空间 如果有空余的空间 按剩余元素占比分配给剩余的元素 跟小哥沟通半天才明白
要求
● ABCD四元素, 数量【10,20,40,40】占比:【20%,20%,30%,30%】 空间:100. 应该给
A分配20的空间 B:20 C:30 D:30, 但A只有10个 要把剩下的10空间按照比例给剩下的元素 也
就是 c5个 d 5个。返回每个元素所需数量

● https://tinyurl.com/y7hn5f26
● DP:凑硬币问题
● 用不同硬币凑成一个数字
● DP: 已知不同硬币的面值,用最少的硬币数量找钱给顾客 public List<Integer>
optimalChange(int[] coins, int target)
● https://tinyurl.com/ya5kozo6
● 第一题,有m 个array,每个array里面的integer是从小到大 sort好的,从这m 个array里面每个
array取出一个值,假设为 a1, a2, ...am, 定义 distance = Max|ai - aj|. ai, aj 属于 a1, a2, ... am.
求distance 的最大值。这题没见过,有点紧张,用priorityqueue做了一下,大哥表示可以。
● https://tinyurl.com/y8xuye3j
● 第二道,给了两个大小悬殊的矩阵,比如一个7*8,一个2*3,找大矩阵里小矩阵匹配多少次。
LZ想了半天也没有naive之外的做法。然后就聊了聊Yahoo文化什么的就结束了。
● KMP?

● G4G算法
● Given an array arr[], find the maximum j – i such that arr[j] > arr[i]
● https://www.geeksforgeeks.org/given-an-array-arr-find-the-maximum-j-i-such-that-arrj-
arri/
● Find the occurrence in a sorted array
● https://www.geeksforgeeks.org/count-number-of-occurrences-or-frequency-in-a-sorted-
array/
● 之后问了几个问题, prove start 和 end的设置不会进入死循环, 为什么是start = mid, 不是mid
+ 1, 然后如果这个function要被called multiple times, 要怎么做
● Given a string, find its first non-repeating character
● https://www.geeksforgeeks.org/given-a-string-find-its-first-non-repeating-character/
● In-place conversion of Sorted DLL to Balanced BST
● https://www.geeksforgeeks.org/in-place-conversion-of-sorted-dll-to-balanced-bst/
● 相反:
● https://articles.leetcode.com/convert-binary-search-tree-bst-to/

● LC算法
● 高频
● 206 Reverse Linked List | x5
● reverse linkedlist interative & recursive
● 给一个linked list,给一个k。linkedlist里面元素k个一组做reverse,最后不足k的也要
reverse。(例如:1-》2-》3-》4-》5-》6-》7-》8,k=3;we would have 3-》2-》1-》
6-》5-》4-》8-》7)
● 146. LRU Cache | x5
● LRU cache,一开始我用python自带数据结构OrderedDict写的,后来他说不要用这么
fancy的data structure,于是只好乖乖地写了doubly linked list的解答
● multi-thread?
● 215 Kth Largest Element in an Array | x4
● 在unsorted array寻找第K大element. 一路演,从各种sort,到quick selection, 到minheap,
maxheap. 最后让实现用maxheap做的方法。五分钟给她秒了,然后她挺满意的,这一轮应
该是strong hired。
● 46. Permutations | x4
● ( DFS + BFS)需要优化一下空间
● 1) 如何判断两个两个字串是permutations的, 2) follow-up 有一个字典,给一个string, 在这
个字典里找出所有此string所有的permutations. 这个function需要被调很多次,所以速度一
定要快 来
● 33. Search in Rotated Sorted Array | x3
● 一个int array,里边的数字先降再升,找到最小值。 e.g: 5,2,1,4,7,9 最优O(lgn)
● Follow up: 找任意一个值 e.g: 2 最优O(lgn)
● 78 Subsets(要求写DFS的解和iteration的解)| x3
● 一个正数的数组,找出subset使得两两在原来的数组里不连续,然后和尽量大。
● Finding all subsets of a given set
● 268 Missing Number | x3
● 跟lc不一样的是可能会有多个missing integer, 要求O(n)
● missing number [1:n] sum 和,面试官希望用bit vector 但是,我太水。。。跪.
● 98. Validate Binary Search Tree | x3
● 277. Find the Celebrity | x2
● https://tinyurl.com/ybplndmo
● LeetCode 277,medium的一题,可惜我恰好没刷到这一题,上来先给了一个O(n^2)的
解法,后来想O(n)的解法想了半天,最后在三姐的提示下用2 pointer做出来了,然后写
了代码,问了我复杂度是什么,这题答的并不好。

● 56 Merge Intervals | x2
● 变形,求所有interval 合起来之后的总长度。
● 第三题follow up第二题,一个平面上,有很多人矩形,矩形可以重叠,求矩形的总面积。
● 387 First Unique Character in a String (One Pass) | x2
● 173. Binary Search Tree Iterator | x2
● BST -> in-order traverse -> how to solve it using iteration
● 77 Combinations | x2
● print all possible product combination of a number
● 给一个string 求长度为n的 所有字母combination (是combination 不是 permutation)
字母可以有重复 这题楼主电面的时候做了permutation的 但是时间不够没做出来 所以就没
提电面 直接做了 先去重 再递归
● 200 Number of Islands | x2
● 13. Roman to Integer | x2
● 3. Longest Substring Without Repeating Characters | x2
● DP
● 198 House Robber
● 337 House Robber III
● 213 House Robber II
● 70. Climbing Stairs
● 120 Triangle
● 300. Longest Increasing Subsequence
● 491. Increasing Subsequences
● 674. Longest Continuous Increasing Subsequence

● Linked List
● 24. Swap Nodes in Pairs
● Tree
● 124. Binary Tree Maximum Path Sum
● 110 Balanced Binary Tree
● 112. Path Sum
● 102 Binary Tree Level Order Traversal
● 366 Find Leaves of Binary Tree
● 270 Closest Binary Search Tree Value
● 543 Diameter of Binary Tree
● 108. Convert Sorted Array to Binary Search Tree
● Array is duplicated?

● Backtracking:
● 349. Intersection of Two Arrays
● 350. Intersection of Two Arrays II
● 283 Move Zeroes
● https://tinyurl.com/y9b4kpeo: 把一个int array的negative number放到array的前面,并且保持
原本相对位置。当时没研究过,就跟说暂时没有想到o(n)+constant space的方法,三叔说我们先
写个working的方法,于是写了个insertion sort的o(n^2)方法,然后又说了个借助另一个array的
o(n)space o(n)时间的方法。。写完以后还是没想到更好的办法,但是注意了!!这时三叔说
:“我不认为这题可以做到比n^2更快”,你没听错!!他并不觉得可以优化!!然后这题就过了
。。问题是貌似别的面经里有要求给o(n)+o(1)的情况。。太迷了。。后来问了问多态和继承的概
念,写了一个简单的多态问题, class A可以被instantiate 成 new B(), new C()的代码,其实就把
B,C搞成interface,A实现B,C就行了,然后就结束了。
● 88. Merge Sorted Array
● 340. Longest Substring with At Most K Distinct Characters
● 680. Valid Palindrome II
● 155. Min Stack
● 42. Trapping Rain Water
● 136. Single Number
● 137 Single Number II
● 260 Single Number III
● 54. Spiral Matrix
● 269. Alien Dictionary
● 84. Largest Rectangle in Histogram
● 我打算给标准的stack的解法,他说换一种方法做,提示divide and conquer
● 166. Fraction to Recurring Decimal
● 240 Search a 2D Matrix II
● https://tinyurl.com/y956b8zz
● 一开始面试官告诉我输入是一张图片,找出图片中面积最大的物体,返回其最大面积,我一开始一
脸懵逼,问他是不是图片是一个rgb格式的三维矩阵来表示的,后来他说是二维黑白图片,矩阵里
只有0和1,1表示那个点是有物体的,我才放下心来
● 118 Pascal's Triangle
● 119 Pascal's Triangle II
● 杨辉三角给横纵坐标,输出数字。
● 28 Implement strStr()
● 215 Kth Largest Element in an Array
● 49 Group Anagrams
● https://tinyurl.com/y956b8zz: 输入一共两个,一个是word dictionary的数组,比如W
= ['odor', 'door', 'walk', 'meet'],另一个是一个query word,比如q = 'ordo',输出是W里面所
有query word的anagram,此处就是['odor', 'door'],一开始我想的是把query word变成一个
dict,key是character,value就是这个字母在这个单词里出现的次数,比如‘ordo'就会变成
{‘o': 2, 'r': 1, 'd': 1},然后用这个dict跑去W里面一个词一个词地查过去,match到了就把这个词
加进结果里,后来面试官说q是一个data stream,不断地有query word来,有没有更快的方法不
用每来一个query就在W里面一个一个查过去,然后我想到了先把W的数据结构变化一下,变成一
个dict of dict,key就是之前的dict,value是一个数组,包含所有符合当前dict的所有anagram的
词,当然因为dict是nonhashable type,所以要把key变成一个tuple,所以在这里W就变成了
{(('o', 2), ('d', 1), ('r', 1)): ['odor', 'door'], (('m', 1), ('e', 2), ('t', 1)): ['meet'], ...},然后每来一个
query就把query word变成这个tuple一样的数据结构,直接从dict里面读取对应的anagram就行
● 21 Merge Two Sorted Lists
● 55. Jump Game
● 还有给定target,iteratively 在BST里找 都要bug free
● 7. Reverse Integer
● follow up是如何check一个integer是一个palindrom number
● 316. Remove Duplicate Letters
● 151. Reverse Words in a String
● 186 Reverse Words in a String II
● 557 Reverse Words in a String III
● 32. Longest Valid Parentheses
● 703. Kth Largest Element in a Stream
● 215. Kth Largest Element in an Array
● 338. Counting Bits
● https://tinyurl.com/ycaor7xr
● Follow up : LC 401Binary Watch
● 第一题countbits,然后说,第二题跟这个有关,第二题是digital watch, 楼主忘记了前面的提示
,可以用countbits做,就先来了个backtracking的,然后小哥又提示了一遍,直呼自己傻,两个
for loop 解决。
● 72 Edit Distance
● 给两个set of string. 返回所有edit distance为1的pair。 让我写计算edit distance方法,我写出了
二维dp的解法,并做了完整的demo。他挺满意,然后问我能否用O(m + n)的方法计算edit
distance。这个真想不起来了,也没时间。edit distance 使用双指针就可以实现线性复杂度,因
为已经指定了edit distance就为1,还是不够熟练。哎。
● 1. 2Sum | x4
● 要求 Two Pointer
● two sum with duplicate
● 要求返回所有dinstinct pairs
● 3sum + 调用2Sum
● 75. Sort Colors
● 然后sort color一路演,从bucket sort 到Quick sort,然后说受启发于quick sort的partition,用
两个pivort做partion。然后很快写完了代码。

● Design | OOD
● 高频
● 设计Hashmap | x5
● 变种1
● Follow up:如果很多hash到一个value咋办,multithread咋办。
● 变种2(https://tinyurl.com/y9b4kpeo):
● 题目是设计一个dictionary,先跟他一起列举了dictionary中可能的操作
(search/update/delete.....),然后具体实现,当时跟他说可以用trie或者
hashtable,问他想要哪一种,三哥全程都说你自己决定,只要自圆其说就可以。。我选
的hashtable,然后把hashtable的实现给默写了一遍。。后来又口头讨论优点缺点,怎
么用generic,用bst实现怎么弄,sorted/unsorted list 等等,pros cons分析
● 变种3(https://tinyurl.com/ya4bl63k):
● implement hashmap using c++ (key,value 都是 int, 为了好些,只要求put get) 白板
写的很是随意,直接vector 存pair key value ...由于太随意,syntax 啥的 各种bug。 小
哥没说啥,但是一脸惊呆。。dictionary 里是string. 给preceeding string target, 找到
以这个string 开头的3个最接近的(短的优先,然后alphbatical order)。 bfs 解,楼主脑
子进水加了visted set(多余)。之后问了drawback, memory timeout. 改进trie. 没写

● 设计 TinyUrl | x3
● 4.5 tiny url,问到了怎么设计这个hash,database replication 还有 sharding的东西
● 设计 Queue | x2
● 自己设计一个长度为n的queue,实现offer() 和 qoll()。 我用了一个数组实现。
● Follow up: multithreaded.
● 实现stack,除了普通操作外,还需要getMax。再不给任何extra memory的情况下
,getMax能否比O(N)快?design一种data structure,每个instance可以hold graph中的
node里的某些信息。纯讨论。
● OOD 设计德州扑克 | x2
● OOD 设计Tic-Tac-Toe | x2
● 设计 Circular Buffer
● https://tinyurl.com/y823ushj
● 3.3 follow up1: consumer productor problem,一个semaphore解决
● 3.4 follow up2: 很多个thread同时访问,根据他说只用一个mutex,我做麻烦了
● 设计Server
● https://tinyurl.com/ybplndmo
● 设计一server类,里面有一根do函数,要求这个server每一秒钟最多只能处理5个请求(比如
外面一秒钟调用了6次do,只做前5次)。我问外面调用是不是单线程,她说先考虑单线程。
我就说设置一个counter,每do一次加1,加到5就不做do了,在用一个线程每隔1s清空一下
counter。她说可以。又问我多线程怎么处理,我说就用synchronize把counter++的这一句
锁起来,这样counter就不会被加很多次了。她也说可以。然后时间就到了。

● 设计Register
● https://tinyurl.com/y823ushj
● 4.2 一个class 两个method,register(string name, Filesystem fs), getFS(string name)。很简单
,hashtable
● 4.3 follow up: make it multithread safe,mutex + condition variable
● 设计DB
● https://tinyurl.com/y8aqpm88
● - Database 设计....
● - 2 way hash function 是不是存在? 在Mathmatitcs里叫啥,面试官说是bidirectional....记不清
了。。
● - How to support large scale?
● - How to speed up using cache?
● - Other way to speed up? ----> Redis
● 设计Server-Client System
● https://tinyurl.com/ybhyn26f
● 设计server-client系统,如何uniquely identify client,如何transfer file,如何replace server
when system down…等等等等问了一堆
● 设计电话本
● 怎么分配电话号码。 我先说, 如果不需要考虑用户release电话号码, 只需要一个数记录有多少
个号码被allocated了, 然后可以用10进制的数转化成10位长的电话号码string。 然后印度小哥
说, 要考虑用户释放的号码。 我说, 用个free list把所有available的号码连一起, 他说怎么优化
? 我说你可曾还记得大明湖畔的bloom filter, 允许false positive, 肯定没有false negative。
这样就可以查一个号码是不是可以用了, 而且space要小好多呢。 小哥一愣, 肯定被我这智慧
高端的回答震到了。 停了一下说, 你这个想法太牛逼了, 但是我面试要考你写代码, bloom
filter你肯定写不出来。 我说你怎么知道, 真聪明! 然后他说你还有啥招不, 这样我们的面试就
能愉快的进行了? 我说有个神奇的数据结构, 叫trie。 他说这么神奇啊, 不如你些个class 把需
要的api定义一下吧。 我说好的文西。 写完后小哥说, 你详细实现一下allocate这个function吧
。 我就写了满满一白板, 从怎么定义trie 到使用。 写到最后我能感觉到会有很多问题没处理,
比如用户释放了号码以后, 需要要额外的process去check有没有number是可以reuse。
● 设计 Radix Trie
● https://tinyurl.com/yajrktbn
● 基本的功能,比如添加,查找删除。。。
● 设计MapReduce (怎么统计里边出现次数最多的词) | x3
● 变种1:
● 这不就是传说中的map reduce么? 然后我就按照map reduce的思路说, 弄一堆机器, 每
个机器拿几个document, 然后统计各个次出现的次数, 然后又一堆机器把这些结果
merge起来, 转变成merge k list。 我说到最后, 就是不提map reduce这个熠熠生辉的专
业名词, 制造出来了我是用我智慧的大脑现场想出来了这么一个前无古人后无来者的
solution的假象(其实可能大叔心里想, 小样,我就这么静静地看着你装逼)。 最后打完收
工, 让我问问题, 我就问了些yahoo发展的问题。 感觉大叔是一个很有经验也很nice的人

● 变种2:
● 给一个文件 里面全部都是string 输出出现次数最多的string 以为要MapReduce什么之类的
LZ一脸心虚 小哥紧接着说: 就是统计一下就好 没有scale的需求 于是写了一个打擂台解决
● 变种3:
● 然后让我写个word count的mapper和reducer 然后用python秒了 dryrun了一遍example
然后稍微优化了一下 然后问了hadoop的一些基本知识比如shuffle partition什么的
● OOD 设计Chess Game
● OOD 设计packman
● OOD 设计deque
● OOD设计咖啡机
● 数据库如果query很慢,大概原因, 网路知识.
● OOD设计档案系统
● CS知识点
● 高频
● type www.yahoo.com what happens | x3
● Diamond Problem | x2
● 如何解决速度变慢 | x2
● web system,有一个地方突然变得很慢,怎么debug。还有一些load balancer和NAPT的东
西
● 给了我yahoo邮件的后台的整个picture, 然后突然一天很多用户抱怨邮件进去的mail list那一
页变很慢,让我troubleshooting为啥,我列举了很多方面: database, or web service, ets
可能
● 会有的问题,在白板上列了好多条,但感觉都没答到点上,一直都没有表情,我其中也说了看
network bandwidth是不是drop很多,他说没有,结果他最后告诉我说是网卡坏了,我都不
敢相信自己耳朵,难道网卡坏了,bandwidth不会降吗?

● 网络
● 广告推荐:
● 假设你先访问了bestbuy 过一会儿你访问Yahoo邮箱 发现边栏里出现了你之前bestbuy上看
的item的ADs 问这是如何得到的 LZ没做过web相关 只好瞎猜 小哥说想想cookie LZ表示浏览
器总不能把访问记录发给yahoo吧 然后blabla扯了一通 小哥最后说:这是因为我们和
bestbuy有协议。。。LZ只好 good to know that....
● DNS怎么工作
● https://tinyurl.com/y823ushj
● https://www.zhihu.com/question/23042131

● OS
● mutex lock, semaphore, deadlock之类 问如何防止deadlock LZ完全没有准备这些
● Programming Language
● 类
● 什么是类, 什么是虚类, 什么是继承的问题
● Java缺点,然后讲讲composition的设计原则, 继承方面与c++的区别。
● inheritance?multiple inheritance?然后multiple inheritance带来的问题?
● Java的Garbage Collection
● Dynamic Linking vs. Static Linking
● Dynamic Binding和 Static Binding
● Python vs. C++
● Closure 是啥,啥时候用
● Polymorphism 是啥, 啥叫Runtime Polymorphism
● Function Overwrite 和 Function Overload的区别
● OOP概念,多型
● exception的种类,什么叫POJO, polymorphism. 没有code, 特别简单,看些基础Java就行了

You might also like