把只包含因子2,3和5的数称作丑数(Ugly Number)。
例如6,8都是丑数,但14不是,因为它包含质因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
方法一,运行速率慢,当N较大时尤为明显:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # -*-coding:utf-8 -*- class Solution: def GetUglyNumber_Solution(self, index): if index < 1: return None count = 0 def isUglyNumber(num): while num % 2 == 0: num = num / 2 while num % 3 == 0: num = num / 3 while num % 5 == 0: num = num / 5 if num == 1: return True else: return False num = 1 while True: if isUglyNumber(num): count += 1 if count == index: return num num += 1 if __name__ == '__main__': s = Solution() ret = s.GetUglyNumber_Solution(10) print(ret) |
运行结果为:
1 | 12 |
方法二,运行速度快,应该采用该方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # -*-coding:utf-8 -*- class Solution: def GetUglyNumber_Solution(self, index): if index < 1: return 0 uglyList = [1] twoPointer = 0 threePointer = 0 fivePointer = 0 count = 1 while count != index: minValue = min(2 * uglyList[twoPointer], 3 * uglyList[threePointer], 5 * uglyList[fivePointer]) uglyList.append(minValue) count += 1 if minValue == 2 * uglyList[twoPointer]: twoPointer += 1 if minValue == 3 * uglyList[threePointer]: threePointer += 1 if minValue == 5 * uglyList[fivePointer]: fivePointer += 1 return uglyList[count - 1] if __name__ == '__main__': s = Solution() ret = s.GetUglyNumber_Solution(200) print(ret) |
运行结果为:
1 | 16200 |