题目来源:
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个丑数。