今天做了几个外企的算法题有点郁闷!

xiabeizi 2009-07-21 05:14:43
感觉好像也不是很难就是不会呢???
太郁闷了!!!!
1.Assume you have two singly linked lists, denoted as L1 and L2. It is possible that L1 and L2
meet on some node and have a common tail. If L1 has m nodes and L2 has n nodes, then what is
the best time complexity to check if the two linked lists meet and to find out the meeting point?
(Only O(1) constant amont of extra storage space is allowed.)

A. O((m+n)*log(m+n))
B. O(m*n)
C. O(m+n)
D. O((m+n)*log(m*n))
E. O(log(m*n))

2. Tjere are n green buckets and n red buckets. Each green bucket is of a different size, but for
every green bucket, there is a corresponding red bucket of the dame size. What is the AVERAGE
time complexity to find all matching buckets pairs(red and green bucket of the same size) if the
comparisons between buckets of same color are forbiden. (Only O(1) constant amount of extra
storage space is allowed.)

A. O(n)
B. O(log(n))
C. O(n*n)
D. O(nlog(n))
E. None of the above

请大家帮忙分析一下。
...全文
498 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
AYZBL 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xiabeizi 的回复:]
还有一个算法题大家看下。
If F(n)=50!*5^n(即5的n次方) , (n is positive integer), what number is the least value of n such that F(n) and
F(n+1) have the same number of trailing 0’s (F(n) is represented in decimal)?
A. 34
B. 35
C. 36
D. 37
E. None of the above

我记得编程之美上面有道题说是计算N!的结果(当然也是十进制)后面0的个数的,最后分析得到是1-N中5出现的个数即为0的个数。
比如…
[/Quote]

感觉零的个数完全是由50!决定的,*5^n并不增加任何零的
AYZBL 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xiabeizi 的回复:]
还有一个算法题大家看下。
If F(n)=50!*5^n(即5的n次方) , (n is positive integer), what number is the least value of n such that F(n) and
F(n+1) have the same number of trailing 0’s (F(n) is represented in decimal)?
A. 34
B. 35
C. 36
D. 37
E. None of the above

我记得编程之美上面有道题说是计算N!的结果(当然也是十进制)后面0的个数的,最后分析得到是1-N中5出现的个数即为0的个数。
比如…
[/Quote]

感觉零的个数完全是由50!决定的,*5^n并不增加任何零的
AYZBL 2009-07-23
  • 打赏
  • 举报
回复
不太喜欢这种题
xiabeizi 2009-07-23
  • 打赏
  • 举报
回复
还有一个算法题大家看下。
If F(n)=50!*5^n(即5的n次方) , (n is positive integer), what number is the least value of n such that F(n) and
F(n+1) have the same number of trailing 0’s (F(n) is represented in decimal)?
A. 34
B. 35
C. 36
D. 37
E. None of the above

我记得编程之美上面有道题说是计算N!的结果(当然也是十进制)后面0的个数的,最后分析得到是1-N中5出现的个数即为0的个数。
比如:N!= 2^x + 3^y +5^z .....则 z 即为0的个数。
很容易得到50!中5的个数为12.

如果说F(n) 和 F(n+1)的末尾0的个数相同则应该是50!中 2 的个数 x 减去12(5的个数)之后应该等于n。
不知道我这样分析对么?

可是要计算50!中2的个数有点麻烦!不像求5的个数稍微容易一些。

下面是求得5的个数和代码:
int five_num(int N)
{
int j, num = 0;
for(int i=1; i<=50; i++)
{
j = i;
while(j%2==0)
{
j/=2;
num++;
}
}
return num;
}
各位看一下,有什么好的算法法可以解决这个问题么?
LeonTown 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 LeonTown 的回复:]
针对第一题,比较常见了。
但如果再分析一下,如帖子:
http://topic.csdn.net/u/20090118/20/c71a185b-f217-4c7d-aba7-fad3f8857428.html

其中,有如下两句不明白:
1>

可以证明,p2追赶上p1的时候,p1一定还没有走完一遍环路,p2也不会跨越p1多圈才追上

我们可以从p2和p1的位置差距来证明,p2一定会赶上p1但是不会跳过p1的

因为p2每次走2步,而p1走一步,所以他们之间的差距是一步一步的缩小,4,3,…
[/Quote]

顶一下这个
xiabeizi 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 morilasi 的回复:]
引用 3 楼 LeonTown 的回复:
引用 1 楼 morilasi 的回复:
第一题,我的思路如下:
首先检查尾结点是否相同,o(m+n)
如果尾结点不同,则必无交点
如果相同,举个例子说吧,如果L1长度为12,L2长度为4
则从L1的第五个结点,L2的第一个结点开始遍历。则很容易找到两个链表是在何时相交的
时间复杂度还是o(m+n)


L1应该从12-4=8开始吧

从9开始。。sorry,开始写错了
[/Quote]
呵,确实是从第(12-4+1)个开始!
xiabeizi 2009-07-23
  • 打赏
  • 举报
回复
多谢楼上各位朋友的提醒!
结了~~~~~~~~~~~~
xiabeizi 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 litaoye 的回复:]
25 + 12 + 6 + 3 + 1 = 47(2的因子数)
10 + 2 = 12 (5的因子数)

所以当n > 35后(47-12),就不会增加0了
[/Quote]
呵,多谢谢提醒!
绿色夹克衫 2009-07-23
  • 打赏
  • 举报
回复
25 + 12 + 6 + 3 + 1 = 47(2的因子数)
10 + 2 = 12 (5的因子数)

所以当n > 35后(47-12),就不会增加0了
morilasi 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 LeonTown 的回复:]
引用 1 楼 morilasi 的回复:
第一题,我的思路如下:
首先检查尾结点是否相同,o(m+n)
如果尾结点不同,则必无交点
如果相同,举个例子说吧,如果L1长度为12,L2长度为4
则从L1的第五个结点,L2的第一个结点开始遍历。则很容易找到两个链表是在何时相交的
时间复杂度还是o(m+n)


L1应该从12-4=8开始吧
[/Quote]从9开始。。sorry,开始写错了
LeonTown 2009-07-22
  • 打赏
  • 举报
回复
针对第一题,比较常见了。
但如果再分析一下,如帖子:
http://topic.csdn.net/u/20090118/20/c71a185b-f217-4c7d-aba7-fad3f8857428.html

其中,有如下两句不明白:
1>

可以证明,p2追赶上p1的时候,p1一定还没有走完一遍环路,p2也不会跨越p1多圈才追上

我们可以从p2和p1的位置差距来证明,p2一定会赶上p1但是不会跳过p1的

因为p2每次走2步,而p1走一步,所以他们之间的差距是一步一步的缩小,4,3,2,1,0
到0的时候就重合了



2>

当p2按照每次2步,p1每次一步的方式走,发现p2和p1重合,确定了单向链表有
环路了

接下来,让p2回到链表的头部,重新走,每次步长不是走2了,而是走1,那么当p1和p2再次
相遇的时候,就是环路的入口了。

这点可以证明的:

在p2和p1第一次相遇的时候,假定p1走了n步骤,环路的入口是在p步的时候经过的,那么有

p1走的路径: p+c = n; c为p1和p2相交点,距离环路入口的距离

p2走的路径: p+c+k*L = 2*N; L为环路的周长,k是整数

显然,如果从p+c点开始,p1再走n步骤的话,还可以回到p+c这个点

同时p2从头开始走的话,经过n不,也会达到p+c这点

显然在这个步骤当中p1和p2只有前p步骤走的路径不同,所以当p1和p2再次重合的时候,必
然是在链表的环路入口点上。


请大侠,帮忙解答上述两句。
谢谢!!
firePhoenix1981 2009-07-22
  • 打赏
  • 举报
回复
应该是和green[0]对应的red数值进行比较,笨了,唉
firePhoenix1981 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 firePhoenix1981 的回复:]
第一题可以将一个link list先反序,然后遍历另外一个list,直到到达底部,记录下遍历的长度。这样如果有重合,那么底部必定是反序前list的头,并且假设重合部分有l个,那么 m+n-(2*l+1) = 遍历长度。得到l之后,遍历一下就能找到重合部位了。

这样也是O(m+n)

第二题 4楼的解法好
[/Quote]

4楼的解法里面用到了green[1]和green[0]的比较,还是不行的吧?
firePhoenix1981 2009-07-22
  • 打赏
  • 举报
回复
第一题可以将一个link list先反序,然后遍历另外一个list,直到到达底部,记录下遍历的长度。这样如果有重合,那么底部必定是反序前list的头,并且假设重合部分有l个,那么 m+n-(2*l+1) = 遍历长度。得到l之后,遍历一下就能找到重合部位了。

这样也是O(m+n)

第二题 4楼的解法好
绿色夹克衫 2009-07-22
  • 打赏
  • 举报
回复
第一题是关于链表的,而且是无环链表可以看看这个帖子(别看我的回复,我说的有问题,看11楼TimeMaster的回复)

http://topic.csdn.net/u/20090118/20/c71a185b-f217-4c7d-aba7-fad3f8857428.html

第二题以前也讨论过

http://topic.csdn.net/u/20090404/15/345238a3-43db-4b0d-a43f-8c338112c5c0.html
ThirstyCrow 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xxjjs 的回复:]
四楼正解,第二题应该是O(NLogN)

不允许同色比较,但是可以异色比较啊,采用qsort

1.取G[0]找到同size的R[M],将所有R和G[0]比较排序为两部分,高端和低端
2.去G[1]和R[M]比较,就知道和G[1]匹配的R是在哪一端,在相应的部分重复1和2
[/Quote]
快速排序的空间复杂度为O(log(n))不满足题目要求
xxjjs 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 czylj 的回复:]
1.C 这个比较简单,L1的最后设成L2,二个连起来,检查是否有环,最坏就是走一圈

[/Quote]

这个不对,这样你可以确定有没有环,但是找不到meeting point
还是1楼的是正解,先确定有没有同尾,O(N+M)
如果有取短的一个长度同时开始遍历,可以找到交汇点O(N)或O(M)
综合复杂度是O(N+M)
xxjjs 2009-07-22
  • 打赏
  • 举报
回复
四楼正解,第二题应该是O(NLogN)

不允许同色比较,但是可以异色比较啊,采用qsort

1.取G[0]找到同size的R[M],将所有R和G[0]比较排序为两部分,高端和低端
2.去G[1]和R[M]比较,就知道和G[1]匹配的R是在哪一端,在相应的部分重复1和2



夭夭 2009-07-21
  • 打赏
  • 举报
回复
1.C 这个比较简单,L1的最后设成L2,二个连起来,检查是否有环,最坏就是走一圈
2.B 这个是可以异色比较的,
针对green[0],可以对red[0-n]进行一个二分排序,
针对green[1],大于green[0],则针对red[0-n]已经排过一序了,只要排一半,小于则排小的另一半.
...感觉复杂度与qsort类似,只是qsort是同组排
LeonTown 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 morilasi 的回复:]
第一题,我的思路如下:
首先检查尾结点是否相同,o(m+n)
如果尾结点不同,则必无交点
如果相同,举个例子说吧,如果L1长度为12,L2长度为4
则从L1的第五个结点,L2的第一个结点开始遍历。则很容易找到两个链表是在何时相交的
时间复杂度还是o(m+n)
[/Quote]

L1应该从12-4=8开始吧
加载更多回复(2)

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧