由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 拓扑排序的题怎么做?
相关主题
Google电面面经并求BlessG家这道题怎么做的?
hasPathSum问一个题目merge intervals
再来一道题Docode 问题
三道 Amazon Onsite Coding 题 (转载)问一个题目
Amazon(8)large file的一道题
G onsite 被据,郁闷....发个题目,估计就死在这上面了..判断BT是否BST?
(更新 GOOGLE 面试题) Google intern, team match求帮忙!算法题:如何判断二叉树是AVL?
拓扑排序不用暴力,这道题有没有优化解
相关话题的讨论汇总
话题: int话题: nprev话题: str话题: nbeg话题: bmap
进入JobHunting版参与讨论
1 (共1页)
c********t
发帖数: 5706
1
总听大家说面试碰到拓扑排序题。谁能给一两道。一般怎么解?
w****x
发帖数: 2483
2
const int M = 6;
void printTopoSort(bool a[M][M])
{
int into[M] = {0};
for (int i = 0; i < M; i++)
{
for (int j = 0; j < M; j++)
{
if (a[j][i])
into[i]++;
}
}
int res[M] = {0};
for (int i = 0; i < M; i++)
{
int j = 0;
for (; j < M; j++)
{
if (into[j] == 0)
break;
}
if (j >= M) return;
into[j] = -1;
res[i] = j;
for (int k = 0; k < M; k++)
{
if (a[j][k])
into[k]--;
}
}
for (int i = 0; i < M; i++)
cout< }
c**s
发帖数: 159
3
例如 给定另外一种语言的字典,信息足够多,还原出那种语言的字母表顺序。

【在 c********t 的大作中提到】
: 总听大家说面试碰到拓扑排序题。谁能给一两道。一般怎么解?
c********t
发帖数: 5706
4
多谢两位大侠,看着都很难,我先好好消化消化。

【在 c**s 的大作中提到】
: 例如 给定另外一种语言的字典,信息足够多,还原出那种语言的字母表顺序。
w****x
发帖数: 2483
5

/*
Given an array list of lots of strings, they are arranged by unknown
alphabetical
order, print all possible alphabetical orders (Sort)
*/
void buildMap(const char* str[], int n, int nBeg, bool bMap[26][26])
{
if (str == NULL || n <= 1) // <= 1 not 0
return;
int nPrev = 0;
while (str[nPrev][nBeg] == 0 && nPrev < n) // missing nPrev < n
nPrev++;
int nIter = nPrev + 1;
while (nIter < n)
{
if (str[nPrev][nBeg] != str[nIter][nBeg])
{
assert(str[nPrev][nBeg] >= 'a' && str[nPrev][nBeg] <= 'z');
assert(str[nIter][nBeg] >= 'a' && str[nIter][nBeg] <= 'z');
bMap[str[nPrev][nBeg] - 'a'][str[nIter][nBeg] - 'a'] = true;
buildMap(str + nPrev, nIter - nPrev, nBeg + 1, bMap);
nPrev = nIter;
}
nIter++; //forget ++
}
buildMap(str + nPrev, nIter - nPrev, nBeg + 1, bMap);
}
void printOrder(bool bMap[26][26], int rec[26], bool visit[26], char order[
26], int nIndex)
{
if (nIndex >= 26)
{
for (int i = 0; i < 26; i++)
cout< cout< return;
}
for (int i = 0; i < 26; i++)
{
if (visit[i] || rec[i] != 0) continue;
visit[i] = true;
order[nIndex] = 'a' + i;
for (int j = 0; j < 26; j++)
if (bMap[i][j]) rec[j]--;
printOrder(bMap, rec, visit, order, nIndex+1);
for (int j = 0; j < 26; j++)
if (bMap[i][j]) rec[j]++;
visit[i] = false;
}
}
void PrintAllOrder(const char* str[], int n)
{
if (NULL == str || n <= 0)
return;
bool bMap[26][26] = { false };
buildMap(str, n, 0, bMap);
int rec[26] = { 0 };
for (int i = 0; i < 26; i++)
for (int j = 0; j < 26; j++)
if (bMap[i][j]) rec[j]++;

char order[26];
bool visit[26] = { false };
printOrder(bMap, rec, visit, order, 0);
}

【在 c**s 的大作中提到】
: 例如 给定另外一种语言的字典,信息足够多,还原出那种语言的字母表顺序。
c********t
发帖数: 5706
6
随手就来,你果然有800题的题库和解法啊

【在 w****x 的大作中提到】
:
: /*
: Given an array list of lots of strings, they are arranged by unknown
: alphabetical
: order, print all possible alphabetical orders (Sort)
: */
: void buildMap(const char* str[], int n, int nBeg, bool bMap[26][26])
: {
: if (str == NULL || n <= 1) // <= 1 not 0
: return;

b*****n
发帖数: 143
7
试了一下上面的程序,好像不对呀:
int main() {
const char* str[2];
str[0] = "bcdefghijklmnopqrstuvwxyz";
str[1] = "a";
PrintAllOrder(str, 2);
return 0;
}
是不是应该打印出26种顺序?
l*****a
发帖数: 14598
8
why 26?

【在 w****x 的大作中提到】
:
: /*
: Given an array list of lots of strings, they are arranged by unknown
: alphabetical
: order, print all possible alphabetical orders (Sort)
: */
: void buildMap(const char* str[], int n, int nBeg, bool bMap[26][26])
: {
: if (str == NULL || n <= 1) // <= 1 not 0
: return;

b*****n
发帖数: 143
9
26个字母只有a的位置不确定,不是26种顺序吗?
e********3
发帖数: 229
10
不是很懂这程序的意思,能稍微解释下吗?
相关主题
G onsite 被据,郁闷....发个题目,估计就死在这上面了..G家这道题怎么做的?
(更新 GOOGLE 面试题) Google intern, team match求帮忙!问一个题目merge intervals
拓扑排序Docode 问题
进入JobHunting版参与讨论
w****x
发帖数: 2483
11

不是的,你理解的题和我理解的不一样。
我理解的是一个字典,字典里的单词是按某种字母顺序顺序排列的,
然后打出所有可能得字母顺序, 你看看代码

【在 b*****n 的大作中提到】
: 26个字母只有a的位置不确定,不是26种顺序吗?
b*****n
发帖数: 143
12
懂了,谢谢。
c********t
发帖数: 5706
13
二爷说拓扑排序要用heap,是为什么啊?

【在 w****x 的大作中提到】
: const int M = 6;
: void printTopoSort(bool a[M][M])
: {
: int into[M] = {0};
: for (int i = 0; i < M; i++)
: {
: for (int j = 0; j < M; j++)
: {
: if (a[j][i])
: into[i]++;

b*****n
发帖数: 482
14
关于while loop里字母不同的情况,为什么recursive call里要nBeg+1呢?譬如
str[0] = "ad"
str[1] = "bc"
nBeg+1后d不就排在c前面了么?
另外str[nIter][nBeg]是不是可能越界,然后assert?

【在 w****x 的大作中提到】
:
: 不是的,你理解的题和我理解的不一样。
: 我理解的是一个字典,字典里的单词是按某种字母顺序顺序排列的,
: 然后打出所有可能得字母顺序, 你看看代码

p*****2
发帖数: 21240
15

我说错了吧。我去看看。应该是用queue,最短路径用heap。

【在 c********t 的大作中提到】
: 二爷说拓扑排序要用heap,是为什么啊?
n****r
发帖数: 120
16
大侠能把题目也给出来么?

【在 w****x 的大作中提到】
: const int M = 6;
: void printTopoSort(bool a[M][M])
: {
: int into[M] = {0};
: for (int i = 0; i < M; i++)
: {
: for (int j = 0; j < M; j++)
: {
: if (a[j][i])
: into[i]++;

s****0
发帖数: 117
17
The canonical application of topological sorting (topological order) is in
scheduling a sequence of jobs or tasks based on their dependencies
http://en.wikipedia.org/wiki/Topological_sorting#Examples

【在 c********t 的大作中提到】
: 总听大家说面试碰到拓扑排序题。谁能给一两道。一般怎么解?
1 (共1页)
进入JobHunting版参与讨论
相关主题
不用暴力,这道题有没有优化解Amazon(8)
Time complexityG onsite 被据,郁闷....发个题目,估计就死在这上面了..
问一道google的面试题(更新 GOOGLE 面试题) Google intern, team match求帮忙!
quantcast最近test给的是什么题目阿?还是拓扑排序么?拓扑排序
Google电面面经并求BlessG家这道题怎么做的?
hasPathSum问一个题目merge intervals
再来一道题Docode 问题
三道 Amazon Onsite Coding 题 (转载)问一个题目
相关话题的讨论汇总
话题: int话题: nprev话题: str话题: nbeg话题: bmap