关于一道谷歌面试题——丑数的解答

 

题目来源:

 

 http://blog.csdn.net/cadcisdhht/archive/2011/03/21/6264274.aspx

 

 

 

欢迎探讨~~

 

 

 

Google曾经有一道面试题:找出第1500个丑数。很多人都不知道丑数是什么。不知道怎么办?面试官就坐在对面,可以问他啊。面试官会告诉你只含有2 、3、5三个因子的数就是丑数。

 

 

 

简答:

 

 

2 2 2 ... 3 3 ... 3 5 5 ... 5

 

 

N位数来说,

A(N) = 11...1(N个),从低位到高位以此变动K位。

B(N, K) = 11...122...2

                /     / /     /

                 N-K     K

 

C(K, J) = 222...2 33..35..5

                  /     / /           /

                    K-J        J

 

D(J, I) = 33...355..5

               /    / /    /

                J-I     I

有规律:

SD(J, I) = 1 + J

 

                         N                                   N

SC(K, J) = 1 + sigma{ SD(J, I) } = 1 + sigma{ 1 + J } = ( N + 1 ) * ( N + 2 ) / 2

                        J=1                               J=1

 

                           N   N

SB(N, K) = 1 + sigma{ SC(K, J) } = 1 + sigma{ ( K + 1 ) * ( K + 2 ) / 2 } = 1/6 * N * ( N ^2 + 6 * N + 17 )

                          K=1 K=1

故只需先求

 

 

k = argmax{ SB(N, K) <= 1500 } 

          K

 

若 SB(N, k) < 1500

则再求

 

j = argmax{ SC(k, J) } <= 1500 - SB(N, k)

      J

 

若 SC(k, j) < 1500 - SB(N, k)

则再求

 

i = argmax{ SD(j, I) } <= 1500 - SB(N, k) - SC(k, j)

I

 

这样,由{k, j, i}组合可以得知2,3,5 的组合,从而求出第1500个丑数。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值