题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数.
根据题目规则,只要能判断一个数是不是丑数,遍历即可得到结果,不过时间会比较慢:
<pre><code>`
func isUglyNumber(num:Int) -> Bool {
var number:Int = num
while number%2 == 0 {
number = number/2
}
while number%3 == 0 {
number = number/3
}
while number%5 == 0 {
number = number/5
}
return number == 1 ? true : false
} `</code></pre>
关于丑数的寻找有更高效的方式:
①数组中的首项为1,即第一个丑数为1
②设置三个变量idx2、idx3、idx5存储下标,初始值都为0
③找出数组uglyNumbers[idx2]2、uglyNumbers[idx3]3、uglyNumbers[idx5]*5的最小值,最小值即为下一个丑数,同时更新最小值对应的下标,如果多个数字同时为最小值,则它们的下标都要更新
<pre><code>`
func findUglyNumber(index:Int) -> Int {
var indexMulti2:Int = 0
var indexMulti3:Int = 0
var indexMulti5:Int = 0
var uglyNumbers:[Int] = [1]
var count:Int = 1
while count < index {
let numberMulti2:Int = uglyNumbers[indexMulti2]*2
let numberMulti3:Int = uglyNumbers[indexMulti3]*3
let numberMulti5:Int = uglyNumbers[indexMulti5]*5
let min:Int = findMinNumber(a: numberMulti2, b: numberMulti3, c: numberMulti5)
if min == numberMulti2 {
indexMulti2 += 1
}
if min == numberMulti3 {
indexMulti3 += 1
}
if min == numberMulti5 {
indexMulti5 += 1
}
uglyNumbers.append(min)
count += 1
}
return uglyNumbers[count-1]
}
func findMinNumber(a:Int,b:Int,c:Int) -> Int {
let result = a > b ? b : a
return result > c ? c : result
}`</code></pre>
测试代码:
<pre><code>`
var result:Int = minSort.findUglyNumber(index: 1500)
print("FlyElephant-第1500个丑数---(result)")</code></pre> 最终输出: <pre><code>
FlyElephant-****第1500个丑数****---859963392`</code></pre>