062. 立方数排列(Cubic permutations)

立方数\(41063625 (345^3)\)的各位数重新排列形成另外两个立方数\(6623104 (384^3)\)\(66430125 (405^3)\)。事实上,\(41063625\)是满足以下条件的最小的立方数,即其各位数的重新排列刚好可以形成三个立方数。求满足以下条件的最小立方数,即其各位数的重新排列可以刚好可以形成五个立方数。

分析:此题的思路比较直接,首先我们需要确定如何来判断两个数是否只是另一个数各位数的重新排列,这个方法比较多,我这里用的方法是将数字转化为字符串,并将字符串进行升序排列,然后再重新组成一个字符串。如果两个数字在以上操作之后的值相同,则两个数字互相构成对方的重排列。第二步,我们对特定范围内的数字进行上述操作并生成一个列表,这个范围内只能先猜测,我这里取得是五至一万的数字,之所以最小数是五,则因为四及以及数的立方只有两个数,最多只能形成两个排列,不可能有形成五个重排列的机会。第三步,我们从五开始计算其对应的排列形式,然后在第二步的列表中找同样形式的排列有多少个,当找到一个排列数刚好为五个的数时,则返回这个数的三次方,即为题目所求。代码如下:

# time cost = 1.65 s ± 7.11 ms

from itertools import count

perm = lambda x : "".join(sorted(str(x)))

def cubic_perm(res):
    for i in count(5,1):
        c = perm(i**3)
        if len([x for x in res if x==c]) == 5:
            return i**3

def main():
    res = [perm(i**3) for i in range(5,10001)]
    return cubic_perm(res)