avatar
amazon电面跪了# JobHunting - 待字闺中
s*g
1
Given a 2d array, find the the shape count.就是有1的连续片段的数目。脑袋木了
, collabedit上写了一团乱麻。老爸在旁边切菜,别interviewer叫停了。。。
e.g 1
[
[101]
[010]
[111]
]
count = 3
e.g 2
[
[111]
[001]
[111]
]
count = 1
e.g 3
[
[111111111111]
[000000000001]
[111000000001]
[100000100001]
[100000000001]
[100000000001]
[111111111111]
]
count = 2
avatar
y*n
2
DFS? 感觉这个最近考的很多?
avatar
l*a
3
A电面考这个算难题了吧

【在 s*********g 的大作中提到】
: Given a 2d array, find the the shape count.就是有1的连续片段的数目。脑袋木了
: , collabedit上写了一团乱麻。老爸在旁边切菜,别interviewer叫停了。。。
: e.g 1
: [
: [101]
: [010]
: [111]
: ]
: count = 3
: e.g 2

avatar
s*g
4
如果只需要说用DFS,不用写代码,我就过了。。。。
avatar
s*g
5
一面电面,搞这种题我认跪了,反正也办不了GC,兴趣不大。自己找虐罢了。。

【在 l*****a 的大作中提到】
: A电面考这个算难题了吧
avatar
y*n
6
是Kurmar 还是 Gupta 面的吗?
avatar
s*g
7
红博
avatar
y*n
8
不过少了一个模拟考的机会,也挺可惜的。
A作为高考前的模拟考试其实蛮好的。
avatar
M*a
9
没看懂。
avatar
s*g
10
确实。面A的目的也就是这个。

【在 y***n 的大作中提到】
: 不过少了一个模拟考的机会,也挺可惜的。
: A作为高考前的模拟考试其实蛮好的。

avatar
s*g
11
横竖连起来的1

【在 M**a 的大作中提到】
: 没看懂。
avatar
a*0
12
为什么切菜 给你加油助威还是威胁interviewer 你父亲新疆来的?
avatar
a*0
13
为什么一定要用DFS 不是类似surrounded reigions 吗 可以用 BFS
只不过要设一个variable用于记录cluster的数目
而且BFS过后的要label一下表示不能继续使用 我试着贴一下代码
private void bfs(char[][] board, int i, int j) {

int row = board.length;
int col = board[0].length;
ArrayList queue = new ArrayList();

queue.add(i * col + j);
board[i][j] = 'P';

while (!queue.isEmpty()) {
int cur = queue.get(0);
queue.remove(0);
int x = cur / col;
int y = cur % col;

if (x-1 < 0 || x-1 >= row || y < 0 || y >= col || board[x-1][y] != '
1')
;
else{
queue.add((x-1) * col + y);
board[x-1][y] = 'P';
}

if (x+1 < 0 || x+1 >= row || y < 0 || y >= col || board[x+1][y] != '
1')
;
else{
queue.add((x+1) * col + y);
board[x+1][y] = 'P';
}

if (x < 0 || x >= row || y-1 < 0 || y-1 >= col || board[x][y-1] != '
1')
;
else{
queue.add((x) * col + y-1);
board[x][y-1] = 'P';
}

if (x < 0 || x >= row || y+1 < 0 || y+1 >= col || board[x][y+1] !=
'1')
;
else{ queue.add((x) * col + y+1);
board[x][y+1] = 'P';
}

}
this. count ++ // for the result
}

然后扫描每个点of the board 如果 是1 就调用bfs函数 访问过的1就变成P了 这
样就不会重复计数了
count是 class的一个field
avatar
s*s
14
搞siao~

【在 a**********0 的大作中提到】
: 为什么切菜 给你加油助威还是威胁interviewer 你父亲新疆来的?
avatar
a*0
15
dfs类似 就是扫描matrix的每个点 如果是1 this.count就加一
然后dfs起得作用是label从这点延伸出去的同一个cluster的所有1都变成p 防止重复
dfs拓展需要考虑上下左右和是否是1 如果不是 也没有必要dfs下去了
但是如果是leetcode 可能dfs oj无法通过 不就是 surrounded 区域面积吗
当然最后破坏了数据结构
如果喜欢 可以再一次扫描 把P都变回来1
avatar
t*r
16
# In this solution as soon as we find a 1, we replace
# all the elements in the shape with 2 to avoid double
# counting the 1s. Otherwise, it's simple iteration.
def count_shapes(m):
num_shapes = 0
for r in range(len(m)):
for c in range(len(m[0])):
if m[r][c] == 1:
fill_shape_with_twos(m, r, c)
num_shapes += 1
# restore the original values
for r in range(len(m)):
for c in range(len(m[0])):
m[r][c] = m[r][c] / 2
return num_shapes
def fill_shape_with_twos(m, r, c):
m[r][c] = 2
if r > 0 and m[r-1][c] == 1:
fill_shape_with_twos(m, r-1, c)
if r + 1 < len(m) and m[r+1][c] == 1:
fill_shape_with_twos(m, r+1, c)
if c > 0 and m[r][c-1] == 1:
fill_shape_with_twos(m, r, c-1)
if c + 1 < len(m[0]) and m[r][c+1] == 1:
fill_shape_with_twos(m, r, c+1)
avatar
t*r
18
nice solution

【在 y***n 的大作中提到】
: 我写了一个C++ 的。
: http://ideone.com/GE3w1N
: 一下子写对也不容易。

avatar
y*n
19
其实就是求图有多少个Connected Components.
avatar
c*y
20
看半天才看明白啥意思。。。shape count。。。说白了就是下围棋填满子以后算你有
几块棋被分断了。会画图里的填充算法就行了。弄个stack再弄个image temp buffer就
能做了。
avatar
s*g
21
Given a 2d array, find the the shape count.就是有1的连续片段的数目。脑袋木了
, collabedit上写了一团乱麻。老爸在旁边切菜,别interviewer叫停了。。。
e.g 1
[
[101]
[010]
[111]
]
count = 3
e.g 2
[
[111]
[001]
[111]
]
count = 1
e.g 3
[
[111111111111]
[000000000001]
[111000000001]
[100000100001]
[100000000001]
[100000000001]
[111111111111]
]
count = 2
avatar
y*n
22
DFS? 感觉这个最近考的很多?
avatar
s*g
23
如果只需要说用DFS,不用写代码,我就过了。。。。
avatar
s*g
24
一面电面,搞这种题我认跪了,反正也办不了GC,兴趣不大。自己找虐罢了。。

【在 l*****a 的大作中提到】
: A电面考这个算难题了吧
avatar
y*n
25
是Kurmar 还是 Gupta 面的吗?
avatar
s*g
26
红博
avatar
y*n
27
不过少了一个模拟考的机会,也挺可惜的。
A作为高考前的模拟考试其实蛮好的。
avatar
M*a
28
没看懂。
avatar
s*g
29
确实。面A的目的也就是这个。

【在 y***n 的大作中提到】
: 不过少了一个模拟考的机会,也挺可惜的。
: A作为高考前的模拟考试其实蛮好的。

avatar
s*g
30
横竖连起来的1

【在 M**a 的大作中提到】
: 没看懂。
avatar
a*0
31
为什么切菜 给你加油助威还是威胁interviewer 你父亲新疆来的?
avatar
a*0
32
为什么一定要用DFS 不是类似surrounded reigions 吗 可以用 BFS
只不过要设一个variable用于记录cluster的数目
而且BFS过后的要label一下表示不能继续使用 我试着贴一下代码
private void bfs(char[][] board, int i, int j) {

int row = board.length;
int col = board[0].length;
ArrayList queue = new ArrayList();

queue.add(i * col + j);
board[i][j] = 'P';

while (!queue.isEmpty()) {
int cur = queue.get(0);
queue.remove(0);
int x = cur / col;
int y = cur % col;

if (x-1 < 0 || x-1 >= row || y < 0 || y >= col || board[x-1][y] != '
1')
;
else{
queue.add((x-1) * col + y);
board[x-1][y] = 'P';
}

if (x+1 < 0 || x+1 >= row || y < 0 || y >= col || board[x+1][y] != '
1')
;
else{
queue.add((x+1) * col + y);
board[x+1][y] = 'P';
}

if (x < 0 || x >= row || y-1 < 0 || y-1 >= col || board[x][y-1] != '
1')
;
else{
queue.add((x) * col + y-1);
board[x][y-1] = 'P';
}

if (x < 0 || x >= row || y+1 < 0 || y+1 >= col || board[x][y+1] !=
'1')
;
else{ queue.add((x) * col + y+1);
board[x][y+1] = 'P';
}

}
this. count ++ // for the result
}

然后扫描每个点of the board 如果 是1 就调用bfs函数 访问过的1就变成P了 这
样就不会重复计数了
count是 class的一个field
avatar
a*0
33
dfs类似 就是扫描matrix的每个点 如果是1 this.count就加一
然后dfs起得作用是label从这点延伸出去的同一个cluster的所有1都变成p 防止重复
dfs拓展需要考虑上下左右和是否是1 如果不是 也没有必要dfs下去了
但是如果是leetcode 可能dfs oj无法通过 不就是 surrounded 区域面积吗
当然最后破坏了数据结构
如果喜欢 可以再一次扫描 把P都变回来1
avatar
t*r
34
# In this solution as soon as we find a 1, we replace
# all the elements in the shape with 2 to avoid double
# counting the 1s. Otherwise, it's simple iteration.
def count_shapes(m):
num_shapes = 0
for r in range(len(m)):
for c in range(len(m[0])):
if m[r][c] == 1:
fill_shape_with_twos(m, r, c)
num_shapes += 1
# restore the original values
for r in range(len(m)):
for c in range(len(m[0])):
m[r][c] = m[r][c] / 2
return num_shapes
def fill_shape_with_twos(m, r, c):
m[r][c] = 2
if r > 0 and m[r-1][c] == 1:
fill_shape_with_twos(m, r-1, c)
if r + 1 < len(m) and m[r+1][c] == 1:
fill_shape_with_twos(m, r+1, c)
if c > 0 and m[r][c-1] == 1:
fill_shape_with_twos(m, r, c-1)
if c + 1 < len(m[0]) and m[r][c+1] == 1:
fill_shape_with_twos(m, r, c+1)
avatar
t*r
36
nice solution

【在 y***n 的大作中提到】
: 我写了一个C++ 的。
: http://ideone.com/GE3w1N
: 一下子写对也不容易。

avatar
y*n
37
其实就是求图有多少个Connected Components.
avatar
c*y
38
看半天才看明白啥意思。。。shape count。。。说白了就是下围棋填满子以后算你有
几块棋被分断了。会画图里的填充算法就行了。弄个stack再弄个image temp buffer就
能做了。
avatar
n*n
39
这题我被面过。可以O(N)做出来。就是一行行扫描,基本思想就是count 有多少
disconnected shape, 如果发现两个Disconnected shape又连起来了,count --就好。

【在 c*******y 的大作中提到】
: 看半天才看明白啥意思。。。shape count。。。说白了就是下围棋填满子以后算你有
: 几块棋被分断了。会画图里的填充算法就行了。弄个stack再弄个image temp buffer就
: 能做了。

avatar
u*p
40
现在的电面题都这样了?
avatar
m*u
41
这题直接union find解吧。
avatar
u*n
42
smart啊

【在 n******n 的大作中提到】
: 这题我被面过。可以O(N)做出来。就是一行行扫描,基本思想就是count 有多少
: disconnected shape, 如果发现两个Disconnected shape又连起来了,count --就好。

avatar
l*7
43
这题uf大才小用了
avatar
r*y
44
这题目标是O(n) time, O(1)的space。如果写的DFS是O(n)space过不过也很难说
avatar
t*c
45
这道题dfs可以做到 ontime o1space
把遇到的X都变成O
每个点最多扫描一次
计算count
实际上速度很快,貌似比union find 快

【在 r*******y 的大作中提到】
: 这题目标是O(n) time, O(1)的space。如果写的DFS是O(n)space过不过也很难说
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。