由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问个算法题
相关主题
自己总结了下什么时候用dp(循环),什么时候用递归亚麻新鲜面经
一道MS题问个google的面试题。
rejected by facebook after 2nd phone interview好吧,RP总算小爆发了一次
问一道少见的微软面试题。问一道题
求问关于AMAZON SDE I 的准备经验。请教一道题
请教:boggle puzzle找所有的单词,怎么做?攒人品,google电话面经
求牛人指点a家面试题经典递归题需要搞懂非递归算法吗?
面试遇到老印,这算被黑了吗?DFS比BFS好在哪?
相关话题的讨论汇总
话题: outstr话题: occupmap话题: int话题: jj
进入JobHunting版参与讨论
1 (共1页)
h****b
发帖数: 25
1
一个amazon的算法题描述如下(在以前的面经里面看到的):
boggle游戏的问题:给定一个4*4的矩阵,每个
位置有一个字母,可以从一个位置跳转到周围八个相邻位置中的任何一个,但不能跳到
已经访问过的位置,要求找出所有的单词(假设给定了一个词典)。
这个题目感觉下code的话很难写的啊? 如何用DFS或者递归的话 如何避免访问重发的
元素了或者避免Loop. 还有的话用用DFS的如何构造图呢? 感觉DFS找一个valid word
比较容易, 找出所有的words 感觉太复杂了。大家有什么简洁的算法?。谢谢了 。。
g***y
发帖数: 764
2
递归 和DFS没什么关系

word

【在 h****b 的大作中提到】
: 一个amazon的算法题描述如下(在以前的面经里面看到的):
: boggle游戏的问题:给定一个4*4的矩阵,每个
: 位置有一个字母,可以从一个位置跳转到周围八个相邻位置中的任何一个,但不能跳到
: 已经访问过的位置,要求找出所有的单词(假设给定了一个词典)。
: 这个题目感觉下code的话很难写的啊? 如何用DFS或者递归的话 如何避免访问重发的
: 元素了或者避免Loop. 还有的话用用DFS的如何构造图呢? 感觉DFS找一个valid word
: 比较容易, 找出所有的words 感觉太复杂了。大家有什么简洁的算法?。谢谢了 。。

R***i
发帖数: 78
3
My solution:
prefix tree to store all words in dictionary
for each cell in matrix
do BFS
add to BFS queue only if partial_word can be found in prefix tree and
unvisited
O(n^2) solution, may not be optimal, but guarantee to work.
g*****k
发帖数: 623
4
个人感觉这就是纯递归的算法题

word

【在 h****b 的大作中提到】
: 一个amazon的算法题描述如下(在以前的面经里面看到的):
: boggle游戏的问题:给定一个4*4的矩阵,每个
: 位置有一个字母,可以从一个位置跳转到周围八个相邻位置中的任何一个,但不能跳到
: 已经访问过的位置,要求找出所有的单词(假设给定了一个词典)。
: 这个题目感觉下code的话很难写的啊? 如何用DFS或者递归的话 如何避免访问重发的
: 元素了或者避免Loop. 还有的话用用DFS的如何构造图呢? 感觉DFS找一个valid word
: 比较容易, 找出所有的words 感觉太复杂了。大家有什么简洁的算法?。谢谢了 。。

b********n
发帖数: 29
5
#define N 4
void FindWordsBoggle(char board[][N])
{
int i=0,j=0;
char* outStr = (char*) malloc((N*N+1)*sizeof(char));
int* occupMap = (int*) calloc((N*N),sizeof(int));
int level = 0;
RecursiveBoggle(board, outStr, level, occupMap);
free(occupMap);
free(outStr);
}
void RecursiveBoggle(char board[][N], char* outStr, int level, int*
occupMap)
{
int* occupMapCopy = (int*) malloc((N*N)*sizeof(int));
memcpy(occupMapCopy, occupMap, N*N*sizeof(int));
int i=0,j=0;
for ( ; i < N; i++)
{
for (; j < N; j++)
{
if (!occupMapCopy[i*N+j])
{
outStr[level] = board[i][j];
outStr[level+1] = '\0';
/*Find whether the current string is available as a word.*/
if (FindInDictionary(outStr))
printf("%s\n",outStr);
if (FindPrefixInDictionary(outStr))
{
occupMapCopy[i*N+j] = 2;
/*Label neighbors as traversable*/
LabelNeighbors(occupMapCopy, i, j);
RecursiveBoggle(board, outStr, level+1, occupMapCopy);
}
}
}
}
free(occupMapCopy);
}
void LabelNeighbors(int* occupMap, int i, int j)
{
int ii=0,jj=0;
for (; ii < N; ++ii)
{
for (; jj < N; ++jj)
{
if (occupMap[ii*N+jj] == 2)
/*already used*/
continue;
else if ( abs(ii-i) <=1 && abs(jj-j) <=1 )
/*can be next character*/
occupMap[ii*N+jj] = 0;
else occupMap[ii*N+jj] = 1; /*not reachable*/
}
}
}
s********y
发帖数: 161
6
建议学习programming interview expose里的递归章节,练习一下permutation,
combination, coin change, integer partition,这一类的题(本质上是DFS搜索穷举)
你就没问题了。
f***g
发帖数: 214
7
这个题递归是没错的。
关键在于字典的结构。
用trie可以在第一时间内判断has_prefix()
然后剪纸
1 (共1页)
进入JobHunting版参与讨论
相关主题
DFS比BFS好在哪?求问关于AMAZON SDE I 的准备经验。
目前系统的刷题,题目分类化,求咨询。请教:boggle puzzle找所有的单词,怎么做?
Print all paths from root to leafs in a binary tree求牛人指点a家面试题
排列组合害死人啊面试遇到老印,这算被黑了吗?
自己总结了下什么时候用dp(循环),什么时候用递归亚麻新鲜面经
一道MS题问个google的面试题。
rejected by facebook after 2nd phone interview好吧,RP总算小爆发了一次
问一道少见的微软面试题。问一道题
相关话题的讨论汇总
话题: outstr话题: occupmap话题: int话题: jj