面经------Google Onsite(1)

1.给定一棵二叉树,在这棵树中有一些节点需要被删除,现在有一个可供调用的函数shouldBeErased(Node t)可以用来判断每个节点是否应被移除(返回一个布尔值true或者false)。在删除了那些需要被移除的节点之后,原来的二叉树就会被打散成一棵棵子树,或者说是一个森林,要求返回最终的这个森林(用一个数组来表示,数组中每个元素是对应子树的树根)。
我就说可以用DFS,从树根开始搜索,对每个节点判断一下是否应被删除,如果要删除的话就移除掉它并递归调用此函数来删除左右子树里要删除的节点并合并左右子树得到的森林,如果不删除的话也还是递归地对左右子树进行删除操作,但合并的时候稍微注意一下如果左(或右)子树的树根没有被删除,那么它应该连着当前的树根,也就是说左(右)子树得到的森林中有一个子树并不是剥离出去的。
由于我在这棵树中每个节点都进行了合并左右子树对应森林的操作,分析时间复杂度的话每一层都要进行O(n)的合并,n是原来树中节点总数,树的高度是O(logn),所以总复杂度应该是O(nlogn)。我刚开始分析复杂度的时候就说每个节点都要进行复杂度为O(n)的合并,所以总复杂度是O(n*n)=O(n2),是面试官好心提醒了一下问我复杂度真的是O(n2)吗,我仔细琢磨了一小会儿才改口说是O(nlogn).
其实这并不是最优的做法,当时面试官好像没太在意这个就没让我继续优化。面试完之后我跟同学讨论了一下发现对每个节点都合并左右子节点对应的森林有点浪费,可以把最终结果数组用一个全局变量来存储,每次要拆出一个子树的时候就直接把它添加到那个全局变量数组里,这样就省去了数组合并的操作,于是整个DFS过程对于每个节点来说都是O(1)复杂度,总复杂度就变成了O(n)。

2.You are given a compound word and a dictionary. Your question is to consumer every letter in the word using only words from dictionary. Your need to find the longest list of substring.

Example 1:

Word: “foobar”
Dictionary: [“foo”, “bar”]
Output: [“foo”, “bar”].

Example 2:

Word: “abcde”
Dictionary:[“a”, “b”, “ab”, “cde”]
Output: [“a”, “b”, “cde”].

Explaination: [“ab”, “cde”] can also consume the compound word, but it is shorter than [“a”, “b”, “cde”]


3.a. Given a list of node, find its root. Follow up, return the value of root. Can you do it constant time?

b. Given a list of boarding pass. Return the full trip.

Example:

SJC -> ABC
SFO -> SJC
ABC -> YYZ.
YYZ -> XXX.
Output: SFO -> SJC -> ABC -> YYZ -> XXX

private class BoardingPass {
String departure;
String destination;
}.
4. Remove all “a” and duplicate all “b” in a char array in place.

你可能感兴趣的:(面经)