avatar
Google第一轮面经# JobHunting - 待字闺中
s*u
1
Phone interview,美国人,说话很清楚。不过太健谈了,导致他每次描述问题,说一
大堆,还各种打比方,要搞清楚whole picture真是太费劲了。。
不过人比较nice,希望好运吧。
1.他说warm up一下,说了一大堆,我才搞明白他的意思是,电影里经常有人拿报纸剪
下很多字母,然后拼成一句话去给别人发威胁message之类。(他一上来就说kidnap小
女孩之类,把我吓坏了,以为要写个绑匪和cops的design题。。。。)
然后让我实现一个function,看看能不能拼成一个message。
因为时间过了挺久,我就有点着急,赶紧写了一个hashtable的方法。然后他问我如果
这个message有重复单词怎么办,我才发现自己的bug(只是考虑newspaper里有没有这
个字母,而没有考虑字母的数量),改了一下。
bool compose( string msg, string newspaper){
unordered_map ccnt;
for(auto it = newspaper.begin(); it != newspaper.end(); it++)
ccnt[ *it ]++;
for(auto it = msg.begin(); it != msg.end(); it++){
if( ccnt.count(*it) == 0 || ccnt[ *it ] == 0)
return false;
else
ccnt[ *it ]--;
return true;
}
2.他说他也是听说来的这道题,又是讨论描述了N久才搞明白,还跟我扯你知道为啥美
国分成这48个州么。。。比如给一个矩阵
1 2 2 3 (5)
3 2 3 (4) (4)
2 4 (5) 3 1 Atlantic
(6) (7) 1 4 5
(5) 1 1 2 4
每个数字代表该地区的海拔,然后西边是太平洋,东边是大西洋,让我返回所有path,
每个path能连通大西洋和太平洋,水只能从高处往低处走。
我到最后才发现他这个例子好像有点不对(他说他也不是很清楚,别人给他的。。汗)
,我觉得真正的意思应该是水流是单向的,否则岂不是随便怎么走都能连通??
我就用backtracking的方法,有点类似boggle game那题,从西海岸的点出发,往8个方
向走,如果没超出边界或者没用过,就走下去,直到到达东海岸,把这个路径存下来。
电面结束我才发现我有个bug,就是说,到达东海岸的时候不应该return,因为还可以
沿东海岸往下走。一开始没写这个return,后来手贱加上去,悔啊。。。
如果题目意思我没理解错的话,我感觉我做法是对的。面试官说他理解了,但是他没做
过,不知道对不对,回去跟人讨论讨论。。。。。
class point{
public:
int row;
int col;
}
bool isValid( int row, int col, bool used[HEIGHT][WIDTH] ){
if( row > HEIGHT || col > WIDTH || row < 0 || col < 0 )
return false;
if( used[row][col] )
return false;
return true;
}

void flow( int row, int col, vector &path, vector< list > &
paths, int mat[ HEIGHT] [ WIDTH ], bool used[HEIGHT][WIDTH] ){
int value = mat[row][col];
used[row][col] = true;
point p;
p.row = row;
p.col = col;
path.push_back( p );
if( col == WIDTH - 1 ){
list tmp(path.begin(), path.end());
paths.push_back(tmp);
//return;这里不应该return
}
if( isValid( row - 1, col , used ) && mat[row - 1][col] <= value )
flow( row -1,col,path,paths,mat,used );
if( isValid( row - 1, col - 1 , used ) && mat[row - 1][col -1 ] <= value )
flow( row -1,col - 1,path,paths,mat,used );
if( isValid( row , col - 1 , used ) && mat[row ][col -1 ] <= value )
flow( row,col - 1,path,paths,mat,used );
if( isValid( row + 1, col - 1 , used ) && mat[row + 1 ][col -1 ] <= value )
flow( row + 1,col - 1,path,paths,mat,used );
if( isValid( row + 1, col , used ) && mat[row + 1 ][col ] <= value )
flow( row + 1,col ,path,paths,mat,used );
if( isValid( row + 1, col + 1 , used ) && mat[row + 1 ][col + 1 ] <=
value )
flow( row + 1,col + 1,path,paths,mat,used );
if( isValid( row + 1, col - 1 , used ) && mat[row + 1 ][col - 1 ] <=
value )
flow( row + 1,col - 1,path,paths,mat,used );
if( isValid( row , col + 1 , used ) && mat[row ][col + 1 ] <= value )
flow( row ,col + 1,path,paths,mat,used );
path.pop_back();
used[row][col] = false;
}
vector< list > calPaths( int mat[HEIGHT][WIDTH] ){
vector path;
vector< list > paths;
bool used[HEIGHT][WIDTH] ;
for( int i = 0; i < HEIGHT; i++){
for( int j = 0; j < WIDTH; j++){
used[i][j] = false;
}
}
for( int i = 0; i < HIEGHT;i++){
flow( i, 0, path, paths, mat, used );
}
return paths;
}
avatar
s*u
2
体会:
1.英语听力差了点,碰到老印嫌听不清楚,碰到健谈的老美,又被他东扯西扯搞晕了,
不能get whole picture of the question
2.google电面过两次,每次都是warmup题(主要考数据结构) + 递归题,两次我都被
考了backtracking
3.题目都不算难,还是要提高熟练度,否则面试一紧张很容易没有平时练习的那个状态
avatar
a*e
3
2.他说他也是听说来的这道题,又是讨论描述了N久才搞明白,还跟我扯你知道为啥美
国分成这48个州么。。。比如给一个矩阵
1 2 2 3 (5)
3 2 3 (4) (4)
2 4 (5) 3 1 Atlantic
(6) (7) 1 4 5
(5) 1 1 2 4
#####请问括号里面的数字是什么意思?
每个数字代表该地区的海拔,然后西边是太平洋,东边是大西洋,让我返回所有path,
每个path能连通大西洋和太平洋,水只能从高处往低处走。
我到最后才发现他这个例子好像有点不对(他说他也不是很清楚,别人给他的。。汗)
,我觉得真正的意思应该是水流是单向的,否则岂不是随便怎么走都能连通??
#####若问这里提到的backtracking和recursion有何不同? 我一直不太了解
backtracking
我就用backtracking的方法,有点类似boggle game那题,从西海岸的点出发,往8个方
向走,如果没超出边界或者没用过,就走下去,直到到达东海岸,把这个路径存下来。
电面结束我才发现我有个bug,就是说,到达东海岸的时候不应该return,因为还可以
沿东海岸往下走。一开始没写这个return,后来手贱加上去,悔啊。。。
如果题目意思我没理解错的话,我感觉我做法是对的。面试官说他理解了,但是他没做
过,不知道对不对,回去跟人讨论讨论。。。。。
class point{
public:
int row;
int col;
}
bool isValid( int row, int col, bool used[HEIGHT][WIDTH] ){
if( row > HEIGHT || col > WIDTH || row < 0 || col < 0 )
return false;
if( used[row][col] )
return false;
return true;
}

void flow( int row, int col, vector &path, vector< list > &
paths, int mat[ HEIGHT] [ WIDTH ], bool used[HEIGHT][WIDTH] ){
int value = mat[row][col];
used[row][col] = true;
point p;
p.row = row;
p.col = col;
path.push_back( p );
if( col == WIDTH - 1 ){ ### 如果用vector 保存结果,直接push_back
就行了, 这里用list好像没有什么必要?
list tmp(path.begin(), path.end());
paths.push_back(tmp);
//return;这里不应该return
}
if( isValid( row - 1, col , used ) && mat[row - 1][col] <= value )
flow( row -1,col,path,paths,mat,used );
if( isValid( row - 1, col - 1 , used ) && mat[row - 1][col -1 ] <= value )
flow( row -1,col - 1,path,paths,mat,used );
if( isValid( row , col - 1 , used ) && mat[row ][col -1 ] <= value )
flow( row,col - 1,path,paths,mat,used );
if( isValid( row + 1, col - 1 , used ) && mat[row + 1 ][col -1 ] <= value )
flow( row + 1,col - 1,path,paths,mat,used );
if( isValid( row + 1, col , used ) && mat[row + 1 ][col ] <= value )
flow( row + 1,col ,path,paths,mat,used );
if( isValid( row + 1, col + 1 , used ) && mat[row + 1 ][col + 1 ] <=
value )
flow( row + 1,col + 1,path,paths,mat,used );
if( isValid( row + 1, col - 1 , used ) && mat[row + 1 ][col - 1 ] <=
value )
flow( row + 1,col - 1,path,paths,mat,used );
if( isValid( row , col + 1 , used ) && mat[row ][col + 1 ] <= value )
flow( row ,col + 1,path,paths,mat,used );
path.pop_back();
used[row][col] = false;
}
vector< list > calPaths( int mat[HEIGHT][WIDTH] ){
vector path;
vector< list > paths;
bool used[HEIGHT][WIDTH] ;
for( int i = 0; i < HEIGHT; i++){
for( int j = 0; j < WIDTH; j++){
used[i][j] = false;
}
}
for( int i = 0; i < HIEGHT; i++){
flow( i, 0, path, paths, mat, used );
}
return paths;
}
### 一个小建议, 把i++都改成++i
avatar
s*u
4
#####请问括号里面的数字是什么意思?
当时他是在演示一个path。但按照他后来说的这个意思,这根本不是个有效的path,而
且不止一个path。所以你就无视这个吧。我觉得按我的意思理解,就是个有效的题。
#####若问这里提到的backtracking和recursion有何不同? 我一直不太了解
backtracking
比如最简单的recursion,阶乘,就是从top一直走到down,这个是单向的,只有一个
end那就是n == 1。
backtracking就是回溯,递归的一种,最典型的就是树或者图的DFS和八皇后问题,就
是从一个点出发,往不同的方向走,直到走不通。跟阶乘的区别是,他是多向的,end
有很多。。
### 如果用vector 保存结果,直接push_back
就行了, 这里用list好像没有什么必要?
这里可以用vector,只是他正好提到结果输出lists of points.
的确是可以直接push_back(),因为push_back()传的参数是对象的“复制”而不是“引
用”。我这里clone了一下,主要是因为有时经常用比如 int path[]而不是vector来存
。因为path是一个指针,而且内容一直在变,所以必须整个复制path数组,而不是push
_back一个path指针进去。
### 一个小建议, 把i++都改成++i
这个我一直不明白在for循环里面有啥区别。因为我看的tutorial里,无论是iterator
还是int,都是it++或者i++,但偶尔也有++i
avatar
g*e
5

大法师

【在 a******e 的大作中提到】
: 2.他说他也是听说来的这道题,又是讨论描述了N久才搞明白,还跟我扯你知道为啥美
: 国分成这48个州么。。。比如给一个矩阵
: 1 2 2 3 (5)
: 3 2 3 (4) (4)
: 2 4 (5) 3 1 Atlantic
: (6) (7) 1 4 5
: (5) 1 1 2 4
: #####请问括号里面的数字是什么意思?
: 每个数字代表该地区的海拔,然后西边是太平洋,东边是大西洋,让我返回所有path,
: 每个path能连通大西洋和太平洋,水只能从高处往低处走。

avatar
l*n
6
backtracking的时候push整个数据结构会有很大问题的。正确做法是只用一个
container数据结构来记录状态,有时候甚至借助原数据结构来省空间。
i++比++i似乎少那么一点效率,不过这点也无所谓了,保持个人习惯能流畅书写最重要。

end

【在 s********u 的大作中提到】
: #####请问括号里面的数字是什么意思?
: 当时他是在演示一个path。但按照他后来说的这个意思,这根本不是个有效的path,而
: 且不止一个path。所以你就无视这个吧。我觉得按我的意思理解,就是个有效的题。
: #####若问这里提到的backtracking和recursion有何不同? 我一直不太了解
: backtracking
: 比如最简单的recursion,阶乘,就是从top一直走到down,这个是单向的,只有一个
: end那就是n == 1。
: backtracking就是回溯,递归的一种,最典型的就是树或者图的DFS和八皇后问题,就
: 是从一个点出发,往不同的方向走,直到走不通。跟阶乘的区别是,他是多向的,end
: 有很多。。

avatar
a*e
7
这个path就是用来记录状态的container吧?
找到一个完整的path之后要把path保存到最终结果里。 我一般都把整个path push进去
,请问为啥会出问题?
多谢~

要。

【在 l*n 的大作中提到】
: backtracking的时候push整个数据结构会有很大问题的。正确做法是只用一个
: container数据结构来记录状态,有时候甚至借助原数据结构来省空间。
: i++比++i似乎少那么一点效率,不过这点也无所谓了,保持个人习惯能流畅书写最重要。
:
: end

avatar
s*u
8
我这个vector path传到函数里面是引用,所以的确是只用一个container。至
于vector > paths,这个是结果,自然没法省空间了。

要。

【在 l*n 的大作中提到】
: backtracking的时候push整个数据结构会有很大问题的。正确做法是只用一个
: container数据结构来记录状态,有时候甚至借助原数据结构来省空间。
: i++比++i似乎少那么一点效率,不过这点也无所谓了,保持个人习惯能流畅书写最重要。
:
: end

avatar
a*e
9
war3玩家啊

【在 g*********e 的大作中提到】
:
: 大法师

avatar
u*o
10
牛人呀,最近总面大牌呀!
第一题似乎以前见过,不知是谁报的面经,就是写ransom note。。

【在 s********u 的大作中提到】
: Phone interview,美国人,说话很清楚。不过太健谈了,导致他每次描述问题,说一
: 大堆,还各种打比方,要搞清楚whole picture真是太费劲了。。
: 不过人比较nice,希望好运吧。
: 1.他说warm up一下,说了一大堆,我才搞明白他的意思是,电影里经常有人拿报纸剪
: 下很多字母,然后拼成一句话去给别人发威胁message之类。(他一上来就说kidnap小
: 女孩之类,把我吓坏了,以为要写个绑匪和cops的design题。。。。)
: 然后让我实现一个function,看看能不能拼成一个message。
: 因为时间过了挺久,我就有点着急,赶紧写了一个hashtable的方法。然后他问我如果
: 这个message有重复单词怎么办,我才发现自己的bug(只是考虑newspaper里有没有这
: 个字母,而没有考虑字母的数量),改了一下。

avatar
s*u
11
我是渣渣,真正的渣渣。求要求低一点的公司内推,最好就是ebay这个难度的。。。
ransom note是啥,我就是把newspaper遍历了一遍,用一个unordered_map存字母出现
的次数。。

【在 u*****o 的大作中提到】
: 牛人呀,最近总面大牌呀!
: 第一题似乎以前见过,不知是谁报的面经,就是写ransom note。。

avatar
l*n
12
嗯,这样OK。前面大概是理解错了,没细看你的code。

【在 s********u 的大作中提到】
: 我这个vector path传到函数里面是引用,所以的确是只用一个container。至
: 于vector > paths,这个是结果,自然没法省空间了。
:
: 要。

avatar
g*1
13
请问lz这是面的entry-level么
avatar
z*2
14
第二道palantir interviewstreet 的變形題, 原題好像叫 rainfall 什麼的
avatar
s*u
15
是的,职位是youtube的SDE

【在 g*****1 的大作中提到】
: 请问lz这是面的entry-level么
avatar
s*w
16
rocket fuel 的几道难题之一,大约是 3维还是4维 dp, 挖水渠

【在 z***2 的大作中提到】
: 第二道palantir interviewstreet 的變形題, 原題好像叫 rainfall 什麼的
avatar
c*e
17
我们这流行考把一句话的每个单词倒过来的算法,不能用split string的方法,要用
generic 方法,不能用现成的library里的函数。
比如this is a good place
颠倒成place good a is this

【在 s********u 的大作中提到】
: Phone interview,美国人,说话很清楚。不过太健谈了,导致他每次描述问题,说一
: 大堆,还各种打比方,要搞清楚whole picture真是太费劲了。。
: 不过人比较nice,希望好运吧。
: 1.他说warm up一下,说了一大堆,我才搞明白他的意思是,电影里经常有人拿报纸剪
: 下很多字母,然后拼成一句话去给别人发威胁message之类。(他一上来就说kidnap小
: 女孩之类,把我吓坏了,以为要写个绑匪和cops的design题。。。。)
: 然后让我实现一个function,看看能不能拼成一个message。
: 因为时间过了挺久,我就有点着急,赶紧写了一个hashtable的方法。然后他问我如果
: 这个message有重复单词怎么办,我才发现自己的bug(只是考虑newspaper里有没有这
: 个字母,而没有考虑字母的数量),改了一下。

avatar
l*n
18
rainfall刚瞅了一眼,只是个bfs题目,没有dp。所以肯定不是你说的题目。

【在 s*w 的大作中提到】
: rocket fuel 的几道难题之一,大约是 3维还是4维 dp, 挖水渠
avatar
s*u
19
stringstream和stack也不让用么,那感觉还挺麻烦的。

【在 c*********e 的大作中提到】
: 我们这流行考把一句话的每个单词倒过来的算法,不能用split string的方法,要用
: generic 方法,不能用现成的library里的函数。
: 比如this is a good place
: 颠倒成place good a is this

avatar
a*n
20
i++和++i基本类型的话效率差别可以忽略, 原来面亚麻的时候我写的++i, 阿三说这个
是语法错误。。。

要。

【在 l*n 的大作中提到】
: backtracking的时候push整个数据结构会有很大问题的。正确做法是只用一个
: container数据结构来记录状态,有时候甚至借助原数据结构来省空间。
: i++比++i似乎少那么一点效率,不过这点也无所谓了,保持个人习惯能流畅书写最重要。
:
: end

avatar
m*n
21
解释一下第二题:
http://en.wikipedia.org/wiki/Continental_divide
其实就是要你找出那条线。
感觉这个美国人非常nice。

【在 s********u 的大作中提到】
: Phone interview,美国人,说话很清楚。不过太健谈了,导致他每次描述问题,说一
: 大堆,还各种打比方,要搞清楚whole picture真是太费劲了。。
: 不过人比较nice,希望好运吧。
: 1.他说warm up一下,说了一大堆,我才搞明白他的意思是,电影里经常有人拿报纸剪
: 下很多字母,然后拼成一句话去给别人发威胁message之类。(他一上来就说kidnap小
: 女孩之类,把我吓坏了,以为要写个绑匪和cops的design题。。。。)
: 然后让我实现一个function,看看能不能拼成一个message。
: 因为时间过了挺久,我就有点着急,赶紧写了一个hashtable的方法。然后他问我如果
: 这个message有重复单词怎么办,我才发现自己的bug(只是考虑newspaper里有没有这
: 个字母,而没有考虑字母的数量),改了一下。

avatar
m*n
22
这道题在programming pearl中出现过,大致思路是
首先把句子转过来,然后把每个词转过来。

【在 c*********e 的大作中提到】
: 我们这流行考把一句话的每个单词倒过来的算法,不能用split string的方法,要用
: generic 方法,不能用现成的library里的函数。
: 比如this is a good place
: 颠倒成place good a is this

avatar
m*n
23
这要看i是什么。i是整数的时候最后总是已经优化过了。
但是i可能是自定义的class,或者iterator什么的,所以还是要++i

【在 a****n 的大作中提到】
: i++和++i基本类型的话效率差别可以忽略, 原来面亚麻的时候我写的++i, 阿三说这个
: 是语法错误。。。
:
: 要。

avatar
s*u
24
确实非常nice,有放水嫌疑。
收到HR邮件说过了第一轮。谢谢大家帮助和祝福。
“I've received positive feedback from your phone interview, the team would
like to schedule a 2nd phone interview (same format). Please let me know a
few times that you have available in the next few weeks to take the
interview.”

【在 m******n 的大作中提到】
: 解释一下第二题:
: http://en.wikipedia.org/wiki/Continental_divide
: 其实就是要你找出那条线。
: 感觉这个美国人非常nice。

avatar
c*p
25
Mark
avatar
s*u
26
Phone interview,美国人,说话很清楚。不过太健谈了,导致他每次描述问题,说一
大堆,还各种打比方,要搞清楚whole picture真是太费劲了。。
不过人比较nice,希望好运吧。
1.他说warm up一下,说了一大堆,我才搞明白他的意思是,电影里经常有人拿报纸剪
下很多字母,然后拼成一句话去给别人发威胁message之类。(他一上来就说kidnap小
女孩之类,把我吓坏了,以为要写个绑匪和cops的design题。。。。)
然后让我实现一个function,看看能不能拼成一个message。
因为时间过了挺久,我就有点着急,赶紧写了一个hashtable的方法。然后他问我如果
这个message有重复单词怎么办,我才发现自己的bug(只是考虑newspaper里有没有这
个字母,而没有考虑字母的数量),改了一下。
bool compose( string msg, string newspaper){
unordered_map ccnt;
for(auto it = newspaper.begin(); it != newspaper.end(); it++)
ccnt[ *it ]++;
for(auto it = msg.begin(); it != msg.end(); it++){
if( ccnt.count(*it) == 0 || ccnt[ *it ] == 0)
return false;
else
ccnt[ *it ]--;
return true;
}
2.他说他也是听说来的这道题,又是讨论描述了N久才搞明白,还跟我扯你知道为啥美
国分成这48个州么。。。比如给一个矩阵
1 2 2 3 (5)
3 2 3 (4) (4)
2 4 (5) 3 1 Atlantic
(6) (7) 1 4 5
(5) 1 1 2 4
每个数字代表该地区的海拔,然后西边是太平洋,东边是大西洋,让我返回所有path,
每个path能连通大西洋和太平洋,水只能从高处往低处走。
我到最后才发现他这个例子好像有点不对(他说他也不是很清楚,别人给他的。。汗)
,我觉得真正的意思应该是水流是单向的,否则岂不是随便怎么走都能连通??
我就用backtracking的方法,有点类似boggle game那题,从西海岸的点出发,往8个方
向走,如果没超出边界或者没用过,就走下去,直到到达东海岸,把这个路径存下来。
电面结束我才发现我有个bug,就是说,到达东海岸的时候不应该return,因为还可以
沿东海岸往下走。一开始没写这个return,后来手贱加上去,悔啊。。。
如果题目意思我没理解错的话,我感觉我做法是对的。面试官说他理解了,但是他没做
过,不知道对不对,回去跟人讨论讨论。。。。。
class point{
public:
int row;
int col;
}
bool isValid( int row, int col, bool used[HEIGHT][WIDTH] ){
if( row > HEIGHT || col > WIDTH || row < 0 || col < 0 )
return false;
if( used[row][col] )
return false;
return true;
}

void flow( int row, int col, vector &path, vector< list > &
paths, int mat[ HEIGHT] [ WIDTH ], bool used[HEIGHT][WIDTH] ){
int value = mat[row][col];
used[row][col] = true;
point p;
p.row = row;
p.col = col;
path.push_back( p );
if( col == WIDTH - 1 ){
list tmp(path.begin(), path.end());
paths.push_back(tmp);
//return;这里不应该return
}
if( isValid( row - 1, col , used ) && mat[row - 1][col] <= value )
flow( row -1,col,path,paths,mat,used );
if( isValid( row - 1, col - 1 , used ) && mat[row - 1][col -1 ] <= value )
flow( row -1,col - 1,path,paths,mat,used );
if( isValid( row , col - 1 , used ) && mat[row ][col -1 ] <= value )
flow( row,col - 1,path,paths,mat,used );
if( isValid( row + 1, col - 1 , used ) && mat[row + 1 ][col -1 ] <= value )
flow( row + 1,col - 1,path,paths,mat,used );
if( isValid( row + 1, col , used ) && mat[row + 1 ][col ] <= value )
flow( row + 1,col ,path,paths,mat,used );
if( isValid( row + 1, col + 1 , used ) && mat[row + 1 ][col + 1 ] <=
value )
flow( row + 1,col + 1,path,paths,mat,used );
if( isValid( row + 1, col - 1 , used ) && mat[row + 1 ][col - 1 ] <=
value )
flow( row + 1,col - 1,path,paths,mat,used );
if( isValid( row , col + 1 , used ) && mat[row ][col + 1 ] <= value )
flow( row ,col + 1,path,paths,mat,used );
path.pop_back();
used[row][col] = false;
}
vector< list > calPaths( int mat[HEIGHT][WIDTH] ){
vector path;
vector< list > paths;
bool used[HEIGHT][WIDTH] ;
for( int i = 0; i < HEIGHT; i++){
for( int j = 0; j < WIDTH; j++){
used[i][j] = false;
}
}
for( int i = 0; i < HIEGHT;i++){
flow( i, 0, path, paths, mat, used );
}
return paths;
}
avatar
s*u
27
体会:
1.英语听力差了点,碰到老印嫌听不清楚,碰到健谈的老美,又被他东扯西扯搞晕了,
不能get whole picture of the question
2.google电面过两次,每次都是warmup题(主要考数据结构) + 递归题,两次我都被
考了backtracking
3.题目都不算难,还是要提高熟练度,否则面试一紧张很容易没有平时练习的那个状态
avatar
a*e
28
2.他说他也是听说来的这道题,又是讨论描述了N久才搞明白,还跟我扯你知道为啥美
国分成这48个州么。。。比如给一个矩阵
1 2 2 3 (5)
3 2 3 (4) (4)
2 4 (5) 3 1 Atlantic
(6) (7) 1 4 5
(5) 1 1 2 4
#####请问括号里面的数字是什么意思?
每个数字代表该地区的海拔,然后西边是太平洋,东边是大西洋,让我返回所有path,
每个path能连通大西洋和太平洋,水只能从高处往低处走。
我到最后才发现他这个例子好像有点不对(他说他也不是很清楚,别人给他的。。汗)
,我觉得真正的意思应该是水流是单向的,否则岂不是随便怎么走都能连通??
#####若问这里提到的backtracking和recursion有何不同? 我一直不太了解
backtracking
我就用backtracking的方法,有点类似boggle game那题,从西海岸的点出发,往8个方
向走,如果没超出边界或者没用过,就走下去,直到到达东海岸,把这个路径存下来。
电面结束我才发现我有个bug,就是说,到达东海岸的时候不应该return,因为还可以
沿东海岸往下走。一开始没写这个return,后来手贱加上去,悔啊。。。
如果题目意思我没理解错的话,我感觉我做法是对的。面试官说他理解了,但是他没做
过,不知道对不对,回去跟人讨论讨论。。。。。
class point{
public:
int row;
int col;
}
bool isValid( int row, int col, bool used[HEIGHT][WIDTH] ){
if( row > HEIGHT || col > WIDTH || row < 0 || col < 0 )
return false;
if( used[row][col] )
return false;
return true;
}

void flow( int row, int col, vector &path, vector< list > &
paths, int mat[ HEIGHT] [ WIDTH ], bool used[HEIGHT][WIDTH] ){
int value = mat[row][col];
used[row][col] = true;
point p;
p.row = row;
p.col = col;
path.push_back( p );
if( col == WIDTH - 1 ){ ### 如果用vector 保存结果,直接push_back
就行了, 这里用list好像没有什么必要?
list tmp(path.begin(), path.end());
paths.push_back(tmp);
//return;这里不应该return
}
if( isValid( row - 1, col , used ) && mat[row - 1][col] <= value )
flow( row -1,col,path,paths,mat,used );
if( isValid( row - 1, col - 1 , used ) && mat[row - 1][col -1 ] <= value )
flow( row -1,col - 1,path,paths,mat,used );
if( isValid( row , col - 1 , used ) && mat[row ][col -1 ] <= value )
flow( row,col - 1,path,paths,mat,used );
if( isValid( row + 1, col - 1 , used ) && mat[row + 1 ][col -1 ] <= value )
flow( row + 1,col - 1,path,paths,mat,used );
if( isValid( row + 1, col , used ) && mat[row + 1 ][col ] <= value )
flow( row + 1,col ,path,paths,mat,used );
if( isValid( row + 1, col + 1 , used ) && mat[row + 1 ][col + 1 ] <=
value )
flow( row + 1,col + 1,path,paths,mat,used );
if( isValid( row + 1, col - 1 , used ) && mat[row + 1 ][col - 1 ] <=
value )
flow( row + 1,col - 1,path,paths,mat,used );
if( isValid( row , col + 1 , used ) && mat[row ][col + 1 ] <= value )
flow( row ,col + 1,path,paths,mat,used );
path.pop_back();
used[row][col] = false;
}
vector< list > calPaths( int mat[HEIGHT][WIDTH] ){
vector path;
vector< list > paths;
bool used[HEIGHT][WIDTH] ;
for( int i = 0; i < HEIGHT; i++){
for( int j = 0; j < WIDTH; j++){
used[i][j] = false;
}
}
for( int i = 0; i < HIEGHT; i++){
flow( i, 0, path, paths, mat, used );
}
return paths;
}
### 一个小建议, 把i++都改成++i
avatar
s*u
29
#####请问括号里面的数字是什么意思?
当时他是在演示一个path。但按照他后来说的这个意思,这根本不是个有效的path,而
且不止一个path。所以你就无视这个吧。我觉得按我的意思理解,就是个有效的题。
#####若问这里提到的backtracking和recursion有何不同? 我一直不太了解
backtracking
比如最简单的recursion,阶乘,就是从top一直走到down,这个是单向的,只有一个
end那就是n == 1。
backtracking就是回溯,递归的一种,最典型的就是树或者图的DFS和八皇后问题,就
是从一个点出发,往不同的方向走,直到走不通。跟阶乘的区别是,他是多向的,end
有很多。。
### 如果用vector 保存结果,直接push_back
就行了, 这里用list好像没有什么必要?
这里可以用vector,只是他正好提到结果输出lists of points.
的确是可以直接push_back(),因为push_back()传的参数是对象的“复制”而不是“引
用”。我这里clone了一下,主要是因为有时经常用比如 int path[]而不是vector来存
。因为path是一个指针,而且内容一直在变,所以必须整个复制path数组,而不是push
_back一个path指针进去。
### 一个小建议, 把i++都改成++i
这个我一直不明白在for循环里面有啥区别。因为我看的tutorial里,无论是iterator
还是int,都是it++或者i++,但偶尔也有++i
avatar
g*e
30

大法师

【在 a******e 的大作中提到】
: 2.他说他也是听说来的这道题,又是讨论描述了N久才搞明白,还跟我扯你知道为啥美
: 国分成这48个州么。。。比如给一个矩阵
: 1 2 2 3 (5)
: 3 2 3 (4) (4)
: 2 4 (5) 3 1 Atlantic
: (6) (7) 1 4 5
: (5) 1 1 2 4
: #####请问括号里面的数字是什么意思?
: 每个数字代表该地区的海拔,然后西边是太平洋,东边是大西洋,让我返回所有path,
: 每个path能连通大西洋和太平洋,水只能从高处往低处走。

avatar
l*n
31
backtracking的时候push整个数据结构会有很大问题的。正确做法是只用一个
container数据结构来记录状态,有时候甚至借助原数据结构来省空间。
i++比++i似乎少那么一点效率,不过这点也无所谓了,保持个人习惯能流畅书写最重要。

end

【在 s********u 的大作中提到】
: #####请问括号里面的数字是什么意思?
: 当时他是在演示一个path。但按照他后来说的这个意思,这根本不是个有效的path,而
: 且不止一个path。所以你就无视这个吧。我觉得按我的意思理解,就是个有效的题。
: #####若问这里提到的backtracking和recursion有何不同? 我一直不太了解
: backtracking
: 比如最简单的recursion,阶乘,就是从top一直走到down,这个是单向的,只有一个
: end那就是n == 1。
: backtracking就是回溯,递归的一种,最典型的就是树或者图的DFS和八皇后问题,就
: 是从一个点出发,往不同的方向走,直到走不通。跟阶乘的区别是,他是多向的,end
: 有很多。。

avatar
a*e
32
这个path就是用来记录状态的container吧?
找到一个完整的path之后要把path保存到最终结果里。 我一般都把整个path push进去
,请问为啥会出问题?
多谢~

要。

【在 l*n 的大作中提到】
: backtracking的时候push整个数据结构会有很大问题的。正确做法是只用一个
: container数据结构来记录状态,有时候甚至借助原数据结构来省空间。
: i++比++i似乎少那么一点效率,不过这点也无所谓了,保持个人习惯能流畅书写最重要。
:
: end

avatar
s*u
33
我这个vector path传到函数里面是引用,所以的确是只用一个container。至
于vector > paths,这个是结果,自然没法省空间了。

要。

【在 l*n 的大作中提到】
: backtracking的时候push整个数据结构会有很大问题的。正确做法是只用一个
: container数据结构来记录状态,有时候甚至借助原数据结构来省空间。
: i++比++i似乎少那么一点效率,不过这点也无所谓了,保持个人习惯能流畅书写最重要。
:
: end

avatar
a*e
34
war3玩家啊

【在 g*********e 的大作中提到】
:
: 大法师

avatar
u*o
35
牛人呀,最近总面大牌呀!
第一题似乎以前见过,不知是谁报的面经,就是写ransom note。。

【在 s********u 的大作中提到】
: Phone interview,美国人,说话很清楚。不过太健谈了,导致他每次描述问题,说一
: 大堆,还各种打比方,要搞清楚whole picture真是太费劲了。。
: 不过人比较nice,希望好运吧。
: 1.他说warm up一下,说了一大堆,我才搞明白他的意思是,电影里经常有人拿报纸剪
: 下很多字母,然后拼成一句话去给别人发威胁message之类。(他一上来就说kidnap小
: 女孩之类,把我吓坏了,以为要写个绑匪和cops的design题。。。。)
: 然后让我实现一个function,看看能不能拼成一个message。
: 因为时间过了挺久,我就有点着急,赶紧写了一个hashtable的方法。然后他问我如果
: 这个message有重复单词怎么办,我才发现自己的bug(只是考虑newspaper里有没有这
: 个字母,而没有考虑字母的数量),改了一下。

avatar
s*u
36
我是渣渣,真正的渣渣。求要求低一点的公司内推,最好就是ebay这个难度的。。。
ransom note是啥,我就是把newspaper遍历了一遍,用一个unordered_map存字母出现
的次数。。

【在 u*****o 的大作中提到】
: 牛人呀,最近总面大牌呀!
: 第一题似乎以前见过,不知是谁报的面经,就是写ransom note。。

avatar
l*n
37
嗯,这样OK。前面大概是理解错了,没细看你的code。

【在 s********u 的大作中提到】
: 我这个vector path传到函数里面是引用,所以的确是只用一个container。至
: 于vector > paths,这个是结果,自然没法省空间了。
:
: 要。

avatar
g*1
38
请问lz这是面的entry-level么
avatar
z*2
39
第二道palantir interviewstreet 的變形題, 原題好像叫 rainfall 什麼的
avatar
s*u
40
是的,职位是youtube的SDE

【在 g*****1 的大作中提到】
: 请问lz这是面的entry-level么
avatar
s*w
41
rocket fuel 的几道难题之一,大约是 3维还是4维 dp, 挖水渠

【在 z***2 的大作中提到】
: 第二道palantir interviewstreet 的變形題, 原題好像叫 rainfall 什麼的
avatar
c*e
42
我们这流行考把一句话的每个单词倒过来的算法,不能用split string的方法,要用
generic 方法,不能用现成的library里的函数。
比如this is a good place
颠倒成place good a is this

【在 s********u 的大作中提到】
: Phone interview,美国人,说话很清楚。不过太健谈了,导致他每次描述问题,说一
: 大堆,还各种打比方,要搞清楚whole picture真是太费劲了。。
: 不过人比较nice,希望好运吧。
: 1.他说warm up一下,说了一大堆,我才搞明白他的意思是,电影里经常有人拿报纸剪
: 下很多字母,然后拼成一句话去给别人发威胁message之类。(他一上来就说kidnap小
: 女孩之类,把我吓坏了,以为要写个绑匪和cops的design题。。。。)
: 然后让我实现一个function,看看能不能拼成一个message。
: 因为时间过了挺久,我就有点着急,赶紧写了一个hashtable的方法。然后他问我如果
: 这个message有重复单词怎么办,我才发现自己的bug(只是考虑newspaper里有没有这
: 个字母,而没有考虑字母的数量),改了一下。

avatar
l*n
43
rainfall刚瞅了一眼,只是个bfs题目,没有dp。所以肯定不是你说的题目。

【在 s*w 的大作中提到】
: rocket fuel 的几道难题之一,大约是 3维还是4维 dp, 挖水渠
avatar
s*u
44
stringstream和stack也不让用么,那感觉还挺麻烦的。

【在 c*********e 的大作中提到】
: 我们这流行考把一句话的每个单词倒过来的算法,不能用split string的方法,要用
: generic 方法,不能用现成的library里的函数。
: 比如this is a good place
: 颠倒成place good a is this

avatar
a*n
45
i++和++i基本类型的话效率差别可以忽略, 原来面亚麻的时候我写的++i, 阿三说这个
是语法错误。。。

要。

【在 l*n 的大作中提到】
: backtracking的时候push整个数据结构会有很大问题的。正确做法是只用一个
: container数据结构来记录状态,有时候甚至借助原数据结构来省空间。
: i++比++i似乎少那么一点效率,不过这点也无所谓了,保持个人习惯能流畅书写最重要。
:
: end

avatar
m*n
46
解释一下第二题:
http://en.wikipedia.org/wiki/Continental_divide
其实就是要你找出那条线。
感觉这个美国人非常nice。

【在 s********u 的大作中提到】
: Phone interview,美国人,说话很清楚。不过太健谈了,导致他每次描述问题,说一
: 大堆,还各种打比方,要搞清楚whole picture真是太费劲了。。
: 不过人比较nice,希望好运吧。
: 1.他说warm up一下,说了一大堆,我才搞明白他的意思是,电影里经常有人拿报纸剪
: 下很多字母,然后拼成一句话去给别人发威胁message之类。(他一上来就说kidnap小
: 女孩之类,把我吓坏了,以为要写个绑匪和cops的design题。。。。)
: 然后让我实现一个function,看看能不能拼成一个message。
: 因为时间过了挺久,我就有点着急,赶紧写了一个hashtable的方法。然后他问我如果
: 这个message有重复单词怎么办,我才发现自己的bug(只是考虑newspaper里有没有这
: 个字母,而没有考虑字母的数量),改了一下。

avatar
m*n
47
这道题在programming pearl中出现过,大致思路是
首先把句子转过来,然后把每个词转过来。

【在 c*********e 的大作中提到】
: 我们这流行考把一句话的每个单词倒过来的算法,不能用split string的方法,要用
: generic 方法,不能用现成的library里的函数。
: 比如this is a good place
: 颠倒成place good a is this

avatar
m*n
48
这要看i是什么。i是整数的时候最后总是已经优化过了。
但是i可能是自定义的class,或者iterator什么的,所以还是要++i

【在 a****n 的大作中提到】
: i++和++i基本类型的话效率差别可以忽略, 原来面亚麻的时候我写的++i, 阿三说这个
: 是语法错误。。。
:
: 要。

avatar
s*u
49
确实非常nice,有放水嫌疑。
收到HR邮件说过了第一轮。谢谢大家帮助和祝福。
“I've received positive feedback from your phone interview, the team would
like to schedule a 2nd phone interview (same format). Please let me know a
few times that you have available in the next few weeks to take the
interview.”

【在 m******n 的大作中提到】
: 解释一下第二题:
: http://en.wikipedia.org/wiki/Continental_divide
: 其实就是要你找出那条线。
: 感觉这个美国人非常nice。

avatar
c*p
50
Mark
avatar
a*s
51
今天面Google Intern也面到了LZ说的continental divider的题。
感觉跟LZ理解的不一样,不知道我理解的对不对。 好像是找出continental divider
的点(题目中的括号)
这些点的特征是:从这些点出发,既可以连接到大西洋,也可以连接到太平洋。连接
的原则就是只能往海拔相等或更低的点流动。
这样理解好像也比较符合地理上的定义。
我当时只写出了brute force的方法,就是遍历所有点,然后DFS,看能不能即到太
平洋,又到大西洋。
面完了想想,好像可以遍历所有太平洋沿岸点,做DFS,将走到的点标记为true。然
后从大西洋沿岸DFS,将走到的点标记为true。 最后只需要找出两个都为true的即可,
好像能稍微efficient一点。不知道有没有更好的方法。

【在 s********u 的大作中提到】
: Phone interview,美国人,说话很清楚。不过太健谈了,导致他每次描述问题,说一
: 大堆,还各种打比方,要搞清楚whole picture真是太费劲了。。
: 不过人比较nice,希望好运吧。
: 1.他说warm up一下,说了一大堆,我才搞明白他的意思是,电影里经常有人拿报纸剪
: 下很多字母,然后拼成一句话去给别人发威胁message之类。(他一上来就说kidnap小
: 女孩之类,把我吓坏了,以为要写个绑匪和cops的design题。。。。)
: 然后让我实现一个function,看看能不能拼成一个message。
: 因为时间过了挺久,我就有点着急,赶紧写了一个hashtable的方法。然后他问我如果
: 这个message有重复单词怎么办,我才发现自己的bug(只是考虑newspaper里有没有这
: 个字母,而没有考虑字母的数量),改了一下。

avatar
s*l
52
恭喜通过~
我问一下 你的backtracking是从(0,0) 点开始的
为什么 要其他所有neighbour点都小于当前点的值啊?
我看你题目的描述是 应该是东西海岸的海拔低 中间的高 才算有效路径的把~
比如 1, 2, 3, 2, 1

【在 s********u 的大作中提到】
: Phone interview,美国人,说话很清楚。不过太健谈了,导致他每次描述问题,说一
: 大堆,还各种打比方,要搞清楚whole picture真是太费劲了。。
: 不过人比较nice,希望好运吧。
: 1.他说warm up一下,说了一大堆,我才搞明白他的意思是,电影里经常有人拿报纸剪
: 下很多字母,然后拼成一句话去给别人发威胁message之类。(他一上来就说kidnap小
: 女孩之类,把我吓坏了,以为要写个绑匪和cops的design题。。。。)
: 然后让我实现一个function,看看能不能拼成一个message。
: 因为时间过了挺久,我就有点着急,赶紧写了一个hashtable的方法。然后他问我如果
: 这个message有重复单词怎么办,我才发现自己的bug(只是考虑newspaper里有没有这
: 个字母,而没有考虑字母的数量),改了一下。

avatar
l*a
53

水是往下流的,如果大的话流不过去

【在 s********l 的大作中提到】
: 恭喜通过~
: 我问一下 你的backtracking是从(0,0) 点开始的
: 为什么 要其他所有neighbour点都小于当前点的值啊?
: 我看你题目的描述是 应该是东西海岸的海拔低 中间的高 才算有效路径的把~
: 比如 1, 2, 3, 2, 1

avatar
x*n
54
做BFS,每个点都设个enum,表示 none, leftOnly, rightOnly, both
这样下次碰到就能剪肢了。

divider

【在 a********s 的大作中提到】
: 今天面Google Intern也面到了LZ说的continental divider的题。
: 感觉跟LZ理解的不一样,不知道我理解的对不对。 好像是找出continental divider
: 的点(题目中的括号)
: 这些点的特征是:从这些点出发,既可以连接到大西洋,也可以连接到太平洋。连接
: 的原则就是只能往海拔相等或更低的点流动。
: 这样理解好像也比较符合地理上的定义。
: 我当时只写出了brute force的方法,就是遍历所有点,然后DFS,看能不能即到太
: 平洋,又到大西洋。
: 面完了想想,好像可以遍历所有太平洋沿岸点,做DFS,将走到的点标记为true。然
: 后从大西洋沿岸DFS,将走到的点标记为true。 最后只需要找出两个都为true的即可,

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。