# -*- coding: utf-8 -*-
'''
Python程序员面试算法宝典---解题总结: 第6章 基本数字运算 6.8 如何求有序数列的第500个数的值
题目:
一个有序数列,序列中的每一个值都能被2或者3或者5所整除,1是这个序列的第
一个元素。求第1500个值是多少。
分析:
这个明显是剑指offer中的丑数。
丑数的关键就是不断滑动,通过前面的递推到后面的。
举例:
1,2,3,
那么下一个数是多少,
应该是(1,2,3)这3个候选中的值分别乘以(2,3,5)得到的最小值
1乘以(2,3,5)得到(2,3,5)
2乘以(2,3,5)得到(4,6,10)
3乘以(2,3,5)得到(6,9,15)
那么满足比3大且最小的数自然就是4,得到4后,
下一次的候选者就变成(1,2,3,4),再分别乘以(2,3,5)
下一次的丑数就是5。
何时能够把之前最老的候选者1给剔除掉?
发现1*5已经
不对,有问题,候选者还不能变成(2,3,4),这样就会把下一个
5给遗漏。候选者的更新
关键:
1 书上解法
每个乘以2,乘以3,乘以5的数字都要维持一个丑数数组的下标。
while i < n:
minNumber = min(uglyNumbers[twoIndex] * 2,
uglyNumbers[threeIndex] * 3,
uglyNumbers[fiveIndex] * 5)
# 更新丑数序列
uglyNumbers.append(minNumber)
# 更新大于当前丑数的最大下标,确保下一次比较丑数
# 时,候选值都是大于当前丑数
while uglyNumbers[twoIndex] * 2 <= minNumber:
twoIndex &
Python程序员面试算法宝典---解题总结: 第6章 基本数字运算 6.8 如何求有序数列的第500个数的值
本文总结了Python程序员在面试中遇到的算法问题,聚焦于基本数字运算。第六章探讨了如何在有序数列中高效地找出第500个数的值,通过深入理解数列规律和算法优化,提供了解题思路和实现方法。
摘要由CSDN通过智能技术生成