題目:把只包含因子2、3和5的數(shù)稱作丑數(shù)(Ugly Number)再姑。例如6、8都是丑數(shù)找御,但14不是元镀,因?yàn)樗蜃?。習(xí)慣上我們把1當(dāng)做是第一個(gè)丑數(shù)霎桅。求按從小到大的順序的第1500個(gè)丑數(shù).
根據(jù)題目規(guī)則栖疑,只要能判斷一個(gè)數(shù)是不是丑數(shù),遍歷即可得到結(jié)果滔驶,不過時(shí)間會比較慢:
<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>
關(guān)于丑數(shù)的尋找有更高效的方式:
①數(shù)組中的首項(xiàng)為1遇革,即第一個(gè)丑數(shù)為1
②設(shè)置三個(gè)變量idx2、idx3揭糕、idx5存儲下標(biāo)萝快,初始值都為0
③找出數(shù)組uglyNumbers[idx2]2、uglyNumbers[idx3]3著角、uglyNumbers[idx5]*5的最小值揪漩,最小值即為下一個(gè)丑數(shù),同時(shí)更新最小值對應(yīng)的下標(biāo)吏口,如果多個(gè)數(shù)字同時(shí)為最小值奄容,則它們的下標(biāo)都要更新
<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個(gè)丑數(shù)---(result)")</code></pre> 最終輸出: <pre><code>
FlyElephant-****第1500個(gè)丑數(shù)****---859963392`</code></pre>