题目:把字符串转换成正数
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
返回值描述:
如果是合法的数值表达则返回该数字,否则返回0
题解:通俗读一遍题,好像没有什么需要注意的地方,就是将字符串转换成整数,当不是合法的字符串时或者数值为0时直接返回0。在这道题中,我们需要注意的地方是int类型的取值范围是:[231-1~-231]。
我们可以这么思考问题,将字符串中的最后一个数字拿出来,到了倒数第二个数字时,将倒数第二个数字乘以10加上倒数第一个数字,以此类推,计算最终值。
具体解题步骤为:(以字符串”123456”为例)
将最后一个字符提取出来,然后乘以10的0次方,以此类推:
解题思路为:6*1+5*10+4*10*10+3*10*10*10+2*10*10*10*10+1*10*10*10*10*10
1 | 2 | 3 | 4 | 5 | 6 |
首先从最后一位开始判断是6的话,将字符6减去字符0,然后乘以10^0,逐个进行累加 | |||||
1 | 2 | 3 | 4 | 5 |
|
将字符5减去字符0(ASCII),然后乘以10^1,将sum值累加 | |||||
1 | 2 | 3 | 4 |
|
|
将字符4减去字符0(ASCII),然后乘以10^2,sum值累加 | |||||
1 | 2 | 3 |
|
|
|
将字符3减去字符0(ASCII),然后乘以10^3,sum值累加 | |||||
1 | 2 |
|
|
|
|
将字符2减去字符0(ASCII),然后乘以10^4,sum值累加 | |||||
1 |
|
|
|
|
|
将字符1减去字符0(ASCII),然后乘以10^5,sum值累加,最后输出数字 |
具体C++代码及注释,如下所示:
class Solution { public: int StrToInt(string str) { int sum = 0; int count = 0; int flag = 1;//判断符号位 for (int i = str.length()-1; i >= 0; i--){ if (str[i] == '+' || str[i] == '-'){ if (str[i] == '-') flag = 0; continue; } if (str[i] >= '0' && str[i] <= '9') sum += (str[i] - '0') * pow(10,count++);//pow为次方 else//一旦发现其他未知符号,则返回0 return 0; } if (flag == 0) return -sum; return sum; } };
该算法的时间复杂度为O(N)。
在本题目中,我们还需要注意以下几点:
1、指针可能为空指针以及字符串是否为空字符串
2、正负号的处理
3、输入值的合法性
4、Int类型要防止溢出
5、错误标志,直接返回最终的结果值为0。
其python的代码为:
# -*- coding:utf-8 -*- class Solution: def StrToInt(self, s): # write code here if not s: return 0 res=0 flag=1#符号标志位 numlist=['0','1','2','3','4','5','6','7','8','9'] for i in s: if i == '+': flag=1 elif i =='-': flag=-1 elif i in numlist: res=res*10+(ord(i)-ord('0'))#计算最终结果 else: return 0 return res*symbol#添加相应符合位该程序,是将所有的值逐一进行破解,最终得到结果。