如何在小于O(n)时间复杂度的情况下找到第N个Armstrong数?

时间:2019-05-15 14:20:53

标签: algorithm

阿姆斯壮数系列为1,2,3,4,5,6,7,8,9,153 ...... 如果可能的话,如何以小于O(n)的时间复杂度找到第N个阿姆斯壮数。

我尝试过从1遍历到max_int并检查iTH编号是否为阿姆斯特朗(armstrong),然后尝试将其计算出来并添加到列表中。 然后返回list [n-1]作为第n个阿姆斯壮数字。

2 个答案:

答案 0 :(得分:2)

这可能不是最佳解决方案,但是 根据{{​​3}}文章

  D证明,以10为基数,共有88个自恋(阿姆斯壮)数字。   1985年冬天,经D. Hoey验证。

因此,可能您可以将这些数字添加到列表中,并使用它返回第n个阿姆斯壮数字。这样,返回第n个数字只需要O(1)时间。

它可以避免遍历所有数字并检查是否为阿姆斯壮数字。

另外,根据您所使用的编程语言,您可能不需要全部88个数字,因为某些数字太长(39位数字)并且可能不受许多语言支持。

答案 1 :(得分:0)

无需检查所有排列。如果您尝试[1,2,3,4],则检查结果数位排序后的结果数是否等于1234。例如,[3,2,1,4]不需要任何其他排列。这降低了因数n的复杂度!其中n是位数。例如,以这种方式将所有9位数字贴在脸颊上需要大约28e3支票而不是1e9。