SPOJ第三题(回文数问题)

本文介绍了一道SPOJ题目,要求找到大于给定数字N的最小回文数。通过讨论回文数的性质和利用Python字符串处理的便捷性,提出了解决方案。在优化代码过程中,避免了将字符串转换为列表的操作,从而提高了运行效率。虽然在Python中仍有优化空间,但相比其他语言,仍有较好的性能表现。
摘要由CSDN通过智能技术生成

所谓回文大家应该都听说过,就是正反读都一样,回文数也是如此,比如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),因此,这段代码还有很大的优化空间,如有人指教,深表感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值