<p>我发现这是一个有趣的任务,所以我给了我生锈的Python技能一些练习。</p>
<pre><code>def generate_palindromes_with_length(l):
''' generate a list of palindrome numbers with len(str(palindrome)) == l '''
if l < 1:
return []
if l == 1:
return [x for x in range(10)]
p = []
if (l % 2):
half_length = (l - 1) / 2
for x in xrange(0, 10):
for y in xrange(10 ** (half_length - 1), 10 ** half_length):
p.append(int(str(y) + str(x) + str(y)[::-1]))
else:
half_length = l / 2
for x in xrange(10 ** (half_length - 1), 10 ** half_length):
p.append(int(str(x) + str(x)[::-1]))
p.sort()
return p
def generate_palindrome(minx, maxx):
''' return a list of palindrome numbers in a given range '''
min_len = len(str(minx))
max_len = len(str(maxx))
p = []
for l in xrange(min_len, max_len + 1):
for x in generate_palindromes_with_length(l):
if x <= maxx and x >= minx:
p.append(x)
p.sort
return p
</code></pre>
<p><code>generate_palindromes_with_length</code>是这里的关键部分。该函数生成具有给定小数位数的回文。它对小数点后的奇数和偶数使用不同的策略。示例:如果请求长度5,它将生成模式为<code>abxba</code>的回文,其中<code>a</code>、<code>b</code>、<code>x</code>是1到9之间的任意数字(加上<code>x</code>可以是0)。如果4是请求的长度,则模式为<code>abba</code>。</p>
<p><code>generate_palindrome</code>只需要收集所有所需长度的回文,
还要注意边界。</p>
<p>算法是O(2*p),p是回文数。</p>
<p>算法确实有效。然而,由于我的python技术已经不成熟,任何关于更优雅的解决方案的建议都是值得赞赏的。</p>