Python程序员面试算法宝典---解题总结: 第6章 基本数字运算 6.8 如何求有序数列的第500个数的值

本文总结了Python程序员在面试中遇到的算法问题,聚焦于基本数字运算。第六章探讨了如何在有序数列中高效地找出第500个数的值,通过深入理解数列规律和算法优化,提供了解题思路和实现方法。
摘要由CSDN通过智能技术生成
# -*- 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 &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值