document.write('
整数分为负数与非负数,负数只有一种表示方法,而非负数可以有两种表示方法。例如:-123,
123,+123。因此在判断字符串是否为整数的时候,需要把这几个问题都考虑到。下面主要介绍两
种方法。
方法一:递归法
对于整数而言,例如123,可以看成12*10+3,而12又可以看成1*10+2。而-123可以看成
(-12)*10-3,-12可以被看成(-1)*10-2。根据这个特点可以采用递归的方法来求解,可以首先根据
字符串的第一个字符确定整数的正负,接着对字符串从右往左遍历,假设字符串为“c1c2c3…
cn”,如果cn不是整数,那么这个字符串不能表示成整数;如果这个数是非负数(c1!=\'-\'),那么这
个整数的值为“c1c2c3…cn-1”对应的整数值乘以10加上cn对应的整数值,如果这个数是负数
(c1==\'-\'),那么这个整数的值为c1c2c3%…cn-1对应的整数值乘以10减去cn对应的整数值。而求解
子字符串“c1c2c3…sc-1”对应的整数的时候,可以用相同的方法来求解,因此可以采用递归的方
法来求解。对于“+123”,可以首先去掉“+”,然后处理方法与“123”相同。由此可以得到递
归表达式为:
c1==\'-\'?toint("c1c2c3…cn-1")*10-(cn -\'0\'):toint("c1c2c3…cn-1")*10+(cn-\'0\')。
递归的结束条件为:当字符串长度为1时,直接返回字符对应的整数的值。实现代码如下:
class Test:
def __init__(self):
self.flag=None
def getFlag(self): return self.flag
#判断c是否是数字, 如果是返回True, 否则返回False
def isNumber(self,c):
return c>=\'0\'and c<=\'9\'
"""
判断str是否是数字,如果是返回数字,且设置flag=True,否则设置flag=False
输入参数: str为字符数组, length为数组长度, flag表示str是否是数字
"""
def strtoint(selt,strs,length):
if length>1:
if not self.isNumber(list(strs)[length-1]):
#不是数字
print "不是数字"
self.flag=False
return-1
if list(strs)[0]==\'-\':
return self.strtoint(strs,length-1)*10-(ord(list(strs)[length-1])-ord(\'0\'))
else:
return self.strtoint(strs,length-1)*10+ord(list(strs)[length -1])-ord(\'0\')
else:
if list(strs)[0]==\'-\':
return 0
else:
if notself.isNumber(list(strs)[0]):
print "不是数字"
self.flag=False
return -1
return ord(list(strs)[0])-ord(\'0\')
def strToint(self,s):
self.flag=True
if s==None or len(s)<=0 or (list(s)[0]==\'-\' and len(s)==1):
print "不是数字"
self.flag=False
return -1
if list(s)[0]==\'+\':
return self.strtoint(s[1:len(s)],len(s)-1)
else:
return self.strtoint(s,len(s))
if __name__=="__main__":
t=Test()
s="-543"
print t.strToint(s)
s="543"
print t.strToint(s)
s="+543"
print t.strToint(s)
s="++43"
result=t.strToint(s)
if t.getFlag():
print result
程序的运行结果为:
-543
543
543
不是数字
算法性能分析:
由于这种方法对字符串进行了一次遍历,因此,时间复杂度为O(N)(其中,N是字符串的长度)。
方法二:非递归法
首先通过第一个字符的值确定整数的正负性,然后去掉符号位,把后面的字符串当做正数来处
理,处理完成后再根据正负性返回正确的结果。实现方法为从左到右遍历字符串计算整数的值,
以“123”为例,遍历到‘1’的时候结果为1,遍历到‘2’的时候结果为1*10+2=12,遍历
到‘3’的时候结果为12*10+3=123。其本质思路与方法一类似,根据这个思路实现代码如下:
class Test:
def __init__(self):
self.flag=None
def getFlag(self):return self.flag
#判断c是否是数字, 如果是返回True, 否则返回False
def isNumber(self,c):
return c>=\'0\'and c<=\'9\'
def strToint(self,strs):
if strs==None:
self.flag=False
print "不是数字"
return -1
self.flag=True
res=0
i=0
minus=False #是否是负数
if list(strs)[i]==\'-\':#结果是负数
minus=True
i+=1
if list(strs)[i]==\'+1: #正数
i+=1
while i<len(strs):
if self.isNumber(list(strs)[i]):
res=res*10+ord(list(strs)[i])-ord(\'0\')
else:
self.flag=False
print "不是数字"
return -1
i+=1
return -res if minus else res
if __name__=="__main__":
t=Test()
s="-543"
print t.strToint(s)
s="543"
print t.strToint(s)
s="+543"
print t.strToint(s)
s="++43"
result=t.strToint(s)
if t.getFlag():
print result
算法性能分析:
由于这种方法对字符串进行了一次遍历,因此算法的时间复杂度为O(N)(其中N是指字符串的长
度)。但是由于方法一采用了递归法,而递归法需要大量的函数调用,也就有大量的压栈与弹栈操作
(函数调用都是通过压栈与弹栈操作来完成的)。因此,虽然这两个方法有相同的时间复杂度,但是方
法二的运行速度会比方法一更快,效率更高。
');