题目:把字符串转换成正数

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。数值为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#添加相应符合位
该程序,是将所有的值逐一进行破解,最终得到结果。