iOS猿媛圈

Swift-丑数

2016-12-25  本文已影响10人  FlyElephant

题目:把只包含因子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>

上一篇 下一篇

猜你喜欢

热点阅读