由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问一道google的面试题
相关主题
G家这道题怎么做的?今天灌水不踊跃,出道题吧
fb面经的一题一个N个数的int数组如何找到3个majority的数?
题目: iterative binary tree post order traversalamazon问题求教
面试题再问个amazon面试题
三道 Amazon Onsite Coding 题 (转载)弱弱的问问 2sum, 3sum 的问题
请教一个题目贴点面试题, ms和google的
生成一个有重复数的全排列,怎么做比较好A家面筋:最多用一个循环,怎么去重复?
ebay search组面经,估计要挂请教中文OJ一道题
相关话题的讨论汇总
话题: int话题: slow话题: fast话题: indexmap话题: curr
进入JobHunting版参与讨论
1 (共1页)
s*****9
发帖数: 93
1
Given an array of integers where each element points to the index of the
next element how would you detect if there is a cycle in this array?
Glassdoor上看来的,题目有点不清楚,我猜应该是指向自己就算结束吧,或者指向空
就结束。
O(n)的解法怎么做?
a*******y
发帖数: 1040
2
没看明白遮体什么意思,给个例子?
h********6
发帖数: 285
3
A[i] = j, A[j]是A[i]的下一个元素。
可以把出现过的index都hash起来,然后每次读一个A[i],去找有没有出现过。遍历完了
都没有出现过的话就没有环。
g*****g
发帖数: 34805
4
或者做那个+1, +2的linked list找环,啥时候追上了就是环。

【在 h********6 的大作中提到】
: A[i] = j, A[j]是A[i]的下一个元素。
: 可以把出现过的index都hash起来,然后每次读一个A[i],去找有没有出现过。遍历完了
: 都没有出现过的话就没有环。

l****c
发帖数: 782
5
Yes, this is what I read and forgot.

【在 g*****g 的大作中提到】
: 或者做那个+1, +2的linked list找环,啥时候追上了就是环。
a*******y
发帖数: 1040
6
这个不就是hash这个index就行了吗?
bool FindCycle(int a[], int n)
{
std::map indexmap;
map::iterator it;
for (int i = 0; i < n;i++)
{
indexmap[i] = false;
}
indexmap[0] = true;
for (int i = 0; i < n; i++)
{
if( indexmap[a[i]])
return true;
else
indexmap[a[i]] = true;
}
return false;
}
h********6
发帖数: 285
7
这个题可以不用吧,有index的话就不用和linked list一样判断追没追上了

【在 g*****g 的大作中提到】
: 或者做那个+1, +2的linked list找环,啥时候追上了就是环。
g*****g
发帖数: 34805
8
这就是空间和时间的取舍了。恐怕两者都得知道。

【在 h********6 的大作中提到】
: 这个题可以不用吧,有index的话就不用和linked list一样判断追没追上了
h********6
发帖数: 285
9
恩,的确

【在 g*****g 的大作中提到】
: 这就是空间和时间的取舍了。恐怕两者都得知道。
s*****9
发帖数: 93
10
这个有问题吧?
a[0] = 2
a[1] = 2
a[2] = null
没有cycle, 但是函数返回true。

【在 a*******y 的大作中提到】
: 这个不就是hash这个index就行了吗?
: bool FindCycle(int a[], int n)
: {
: std::map indexmap;
: map::iterator it;
: for (int i = 0; i < n;i++)
: {
: indexmap[i] = false;
: }
: indexmap[0] = true;

相关主题
请教一个题目今天灌水不踊跃,出道题吧
生成一个有重复数的全排列,怎么做比较好一个N个数的int数组如何找到3个majority的数?
ebay search组面经,估计要挂amazon问题求教
进入JobHunting版参与讨论
p*****2
发帖数: 21240
11

感觉你访问每一个点的时候,把内容变成负数,这样你再次访问的时候就知道有环了。

【在 s*****9 的大作中提到】
: 这个有问题吧?
: a[0] = 2
: a[1] = 2
: a[2] = null
: 没有cycle, 但是函数返回true。

m******d
发帖数: 25
12
数组的问题是可能有子数组是循环。比如[null,2,3,null,5,4,6]。所以必须每
一个都遍历到。判断的时候也要考虑可能是子数组循环。
a*******y
发帖数: 1040
13
how do you store NULL in an int array?
m******d
发帖数: 25
14
例如不存在的index: -1或者大于数组长度的值。
关键在于这个和linked list那题有小的不同。
f******s
发帖数: 659
15

如果一个元素自己指向自己,也是个环吧?比如a[2]=2,上面这个算法就查不出来了.

【在 a*******y 的大作中提到】
: 这个不就是hash这个index就行了吗?
: bool FindCycle(int a[], int n)
: {
: std::map indexmap;
: map::iterator it;
: for (int i = 0; i < n;i++)
: {
: indexmap[i] = false;
: }
: indexmap[0] = true;

p*****3
发帖数: 488
16

为什么这个不需要额外空间?

【在 g*****g 的大作中提到】
: 或者做那个+1, +2的linked list找环,啥时候追上了就是环。
k*******t
发帖数: 144
17
两个指针(slow, fast)就够啦,判断list有无loop也不需要额外空间。贴了个代码,比
较ugly, 凑合着看吧
bool hasLoop(int arr[], int len){

int slow = 0;
int fast = 0;
int cur = 0;
while(cur < len)
{
if(arr[slow] != -1)
{
slow = arr[slow];
}
else
{
++slow;
fast = slow;
cur = slow;
continue;
}

int i = 0;
while(i < 2 && arr[fast] != -1)
{
fast = arr[fast];
++i;
}
if(i < 2)
{
++fast;
slow = fast;
cur = fast;
}
else
{
if(fast == slow){
return true;
}
}
}
return false;
}

【在 p*****3 的大作中提到】
:
: 为什么这个不需要额外空间?

r**h
发帖数: 1288
18
我的想法是,用两个set
一个来记录当前路径上出现过的元素(判断当前元素是否在环上)
一个记录所有访问过的元素(防止重复判断)
O(N)空间O(N)时间
bool hasRing(int A[], int N){
unordered_set s, visited;
for(int i=0; i if(visited.find(i) == visited.end()){
int curr = i;
while(curr>=0 && curr if(s.find(curr) != s.end()){
return true;
}
s.insert(curr);
visited.insert(curr);
curr = A[curr];
}
s.clear();
}
}
return false;
}
其他想法我也考虑了一下
如果每个节点都用追赶法判断是否有环的话,时间复杂度变成O(N^2)
另外把访问过的节点设置成-1是不可行的
比如说下面的例子
1->2->3->4->5->END
6->7->3->4->5->END
实际上并没有环,但是第二次访问到3的时候发现节点的next是-1
Y********f
发帖数: 410
19
这个就是有向图(这里每个节点只有一条始发边)的环问题。一个visit数组,一个
visitStack数组(回溯的时候要重置),进行dfs就可以了。

【在 s*****9 的大作中提到】
: Given an array of integers where each element points to the index of the
: next element how would you detect if there is a cycle in this array?
: Glassdoor上看来的,题目有点不清楚,我猜应该是指向自己就算结束吧,或者指向空
: 就结束。
: O(n)的解法怎么做?

x*****0
发帖数: 452
20
mark
相关主题
再问个amazon面试题A家面筋:最多用一个循环,怎么去重复?
弱弱的问问 2sum, 3sum 的问题请教中文OJ一道题
贴点面试题, ms和google的问个面试题
进入JobHunting版参与讨论
c********p
发帖数: 1969
21
哦,以前看到这道题,但依然不知道怎么作。。。
w*******z
发帖数: 160
22
我觉得得先把边界条件都define了
a****a
发帖数: 37
23
如果数组是well formed. 就是for any 0<=i 断有没有duplicated entry就行?如果没有,一定有circle.
1 (共1页)
进入JobHunting版参与讨论
相关主题
请教中文OJ一道题三道 Amazon Onsite Coding 题 (转载)
问个面试题请教一个题目
求解一道数组找最大cycle长度的问题生成一个有重复数的全排列,怎么做比较好
请教一道面试题ebay search组面经,估计要挂
G家这道题怎么做的?今天灌水不踊跃,出道题吧
fb面经的一题一个N个数的int数组如何找到3个majority的数?
题目: iterative binary tree post order traversalamazon问题求教
面试题再问个amazon面试题
相关话题的讨论汇总
话题: int话题: slow话题: fast话题: indexmap话题: curr