回文数,整数反转,罗马数字反转整数——python实现

回文数,整数反转,罗马数字反转整数代码归纳

1.回文数

题目描述:
在这里插入图片描述
我自己的思路是:将输入的数字转化为字符串,将字符串分为前半部分和后半部分,分别将其使用append()函数传入列表里,然后比较两个列表是否相等。代码如下:

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        xs=str(x)
        L=len(xs)
        List1=[]
        List2=[]
        m=L%2
        flag=L
        if m==0:#偶数
            h1=L//2
            while flag>h1:
                a=xs[flag-1]
                b=xs[L-flag]
                List2.append(b)
                List1.append(a)
                flag-=1
            return List2[:]==List1[:]
        elif m==1:
            h2=L//2+1
            while flag>h2:
                a=xs[flag-1]
                List1.append(a)
                b = xs[L-flag]
                List2.append(b)
                flag-=1
        return List2[:]==List1[:]

在网上看有一个人写的,特别简单,顿时觉得自己好傻哦,还是学的太少了,代码如下:

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        xs=str(x)
        return xs[:]==xs[::-1]

也是将数字转化字符串,然后直接使用xs[::-1]反转字符串,比较就行。
xs[::]的用法总结:
s=‘12345’。
s[i:j:k],的意思是从第i个位置开始到第j个位置间隔k个元素输出字符串:

b[1:2:]#从第1个位置开始,第2个位置结束,间隔不写默认为1
Out[15]: '2'#输出2
b[1::]#从从第1个位置开始,结束下标不写默认到最后一个,间隔不写默认为1
Out[16]: '2345'#输出2345
b[::1]#间隔为1,输出全部字符
Out[19]: '12345'
b[::-1]#-1代表反向顺序,输出全部字符
Out[20]: '54321'

2.整数反转

题目描述:
在这里插入图片描述
通过X%10可以取到X的个位数,X//10可以依次将X最后一位数字取掉(1234//10=123,123//10=12)。
将输入的数字先去绝对值,最后返回的时候在加上符号。
分析:X=1234变成4321,Temp=X%10=4,ans=ans+Temp10=4,X=1234//10=123;Temp=X%10=3,ans=ans10+Temp=43,X=123//10=12;…,依次类推就可得到ans=4321。代码如下:

class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        X=abs(x)
        tmp = 0
        ans = 0
        while X > 0:
            tmp = X % 10
            ans = ans * 10 + tmp
            X//= 10
        if ans<(-2)**31 or ans>(2**31)-1:
            return 0
        elif x>0:
            return ans
        else:
            return ans*(-1)

3.罗马数字反转整数

题目描述:
在这里插入图片描述
先将罗马数字以及其代表的数字大小放在字典里,然后对输入字符串使用enumrate()函数,使其包含的罗马数字按照顺序排列。比较第i个和第i+1的罗马数字代表的数值大小,如果i>i+1,则Temp+=Value[i],反之,Temp-=Value[i]。在进行比较的过程中,使用的是for循环,因此只能加到第i-1个罗马数字,且需要设置i<n-1(n为输入包含罗马字符的个数),因为第i个在比较的时候没有元素可比了。
代码如下:

class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        Dire={
            'I':1,
            'V':5,
            'X':10,
            'L':50,
            'C':100,
            'D':500,
            'M':1000,
        }
        Temp=0
        n=len(s)
        for Key,Val in enumerate(s):
             if Key<n-1 and Dire[s[Key]]<Dire[s[Key+1]]:
                Temp-=Dire[s[Key]]
             else:
                Temp+=Dire[s[Key]]
        return Temp

注意

  1. if Key<n-1 and Dire[s[Key]]<Dire[s[Key+1]],是先判断and前面的,在判断and后面的,如果前面的为假,就会直接执行else对应的语句。我当时就太粗心,把Key<n-1写到了后面,就一直报错。
  2. if 和else下面那个写 Temp-=Dire[s[Key]], Temp+=Dire[s[Key]],也是需要考虑的。
#错误的:
#之前分析过最后需要加上Dire[s[n]]最后一个罗马数,这样写的话,
#在从第1个到n-1个罗马数的时候,像VII,在计算到I和I的时候,就直接不满足#Dire[s[Key]]>Dire[s[Key+1]],然后变成了 Temp-=Dire[s[Key]],输出就会出错,
#如果改成Dire[s[Key]]>=Dire[s[Key+1]],也是错误的,由于当Key=n的时候,没有加上Dire[s[n]]最后一个罗马数。
if Key<n-1 and Dire[s[Key]]>Dire[s[Key+1]]:
                Temp+=Dire[s[Key]]
else:
                Temp-=Dire[s[Key]]
#正确的:
#当Key<n-1不满足,也就是Key=n的时候,直接执行else,就会加上最后一个数,当罗马数字相等的时候也是相加。
if Key<n-1 and Dire[s[Key]]<Dire[s[Key+1]]:
                Temp-=Dire[s[Key]]
else:
                Temp+=Dire[s[Key]]

还有一种写法,是不使用enumerate()函数:


class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        Dire={
            'I':1,
            'V':5,
            'X':10,
            'L':50,
            'C':100,
            'D':500,
            'M':1000,
        }
        L=len(s)
        i=0
        Temp=0
        if L>15:
            return 0
        for i in range(L-1):
            if Dire[s[i]]>Dire[s[i+1]]:
                Temp+=Dire[s[i]]
            else:
                Temp-=Dire[s[i]]
            Temp=Temp+Dire[s[-1]]#加上最后一个
        return Temp
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值