所谓回文大家应该都听说过,就是正反读都一样,回文数也是如此,比如11,121等
这道题目核心要求是输入一个数字N,然后求出比N大的最小的一个回文数。例如:输入111,输出为121
完整题目请点击:The Next Palindrome,本人提交的代码如下:
def pali(a):
leng=len(a)
#首先确定输入序列长度的奇偶性
if leng%2==0:
if a[0:leng/2][::-1]>a[leng/2:]:
return a[0:leng/2]+a[0:leng/2][::-1]
#如果前一半序列逆序后比后一半序列大,只需将前一半序列反转一次,拼接得到的新序列即为所求
else:
for i in range(leng/2-1,-1,-1):
if a[i]!='9':
b=str(int(a[i])+1)
break
<pre name="code" class="python">#对于前一半序列逆序后比后一半序列小的,从序列中间位开始向第一位进行处理,如果是9,将该位置上的数字置为0,读前一位;若不是9,该位次的数字+1,退出循环
c=a[:i]+b+'0'*(leng/2-i-1)
<pre name="code" class="python">#前i位的序列无需修改,第i+1位的替换成b的值,i+2位之后为0,拼接得到的序列即为所求的前半部分序列
return c+c[::-1]
#将前半部分反转得到后半部分序列,两序列相加即可
else:
if a[0:leng/2][::-1]>a[leng/2+1:]:
return a[0:leng/2]+a[leng/2]+a[0:leng/2][::-1]
else:
if a[leng/2]!='9':
b=str(int(a[leng/2])+1)
return a[0:leng/2]+b+a[0:leng/2][::-1]
else:
for i in range(leng/2-1,-1,-1):
if a[i]!='9':
b=str(int(a[i])+1)
break
c=a[:i]+b+'0'*(leng/2-i-1)
return c+'0'+c[::-1]
#奇数和偶数类似,单独出来中间位即可
line=int(raw_input())
for i in range(line):
num=raw_input()
length=len(num)
if num=='9'*length:
b='1'+'0'*(length-1)+'1'
print b
<span style="white-space:pre"> </span>#对9,99,999...之类的数单独处理
else:
print pali(num)
题目一个易错点就是处理诸如9,99,999,9999....之类的数,因为这些数字所输出的结果的位数应该要多一位,因此在程序中首先解决这种情况
其次就是求回文数,因为题目要求最大的输入值相当大,不超过100万位,这是一个非常庞大的数,因此在代码中采取了如下措施:
只取输出序列的前一半,因为这是回文数,只需操作一半序列即可,当然奇数长度还需对最中间一位数字进行单独处理
因为所对比的序列都是等长的,无需转换成数值类型再比较,直接比较即可
因为Python对字符串的处理相当方便、快捷,a[::-1]这种方法对序列进行翻转
最开始的原始代码效率相当低下,因为我使用了list()函数,Python中字符串无法修改,因此想转换为数组处理,而这严重拖慢了程序运行速度,最终改成现在所用形式
当然,在此题的最优解法中(不考虑其它语言,排行榜都被C屠榜了),使用Python2.7的人中也有速度特别快的(时间0.00,内存4.0M),本人代码消耗(时间0.06,内存4.0M),因此,这段代码还有很大的优化空间,如有人指教,深表感谢!