回文数,整数反转,罗马数字反转整数代码归纳
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
注意:
- if Key<n-1 and Dire[s[Key]]<Dire[s[Key+1]],是先判断and前面的,在判断and后面的,如果前面的为假,就会直接执行else对应的语句。我当时就太粗心,把Key<n-1写到了后面,就一直报错。
- 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