49-把字符串转换成整数

一 题目

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0

输入描述:

输入一个字符串,包括数字字母符号,可以为空

输出描述:

如果是合法的数值表达则返回该数字,否则返回0

二 思路

扫描字符串,逐个判断每个字符是否合法,当不合法的时候直接返回0,合法时将该字符转为数字。

对于有符号位的字符串,将符号位设置为字符0,则可以在扫描字符串的时候与无符号位的字符串一样,统一从第一位字符开始,而不是从第二位字符开始。最后在结果中再加上符号。

C++:

class Solution {
public:
    int StrToInt(string str) {
        //空字符串,返回0
        if(str.size() == 0) return 0;
        //处理正、负号情况
        int sign = 1;
        if(str[0] == '+'){
            str[0] = '0';
        }
        if(str[0] == '-'){
            str[0] = '0';
            sign = -1;
        }
        int ans = 0;
        //遍历字符串
        for(int i=0;i<str.size();i++){
            //非法字符
            if(str[i] < '0' || str[i] > '9'){
                return 0;
            }
            //合法字符
            ans = ans * 10 + (str[i] - '0');
        }
        return sign * ans;
    }
};

公式:将字符str[i] 转为数字 :str[i] - '0'

字符0的ascill值是48,字符1的是49,其它字符数字依次往后排,所以字符1减去字符0的值为1,而ascill值实际上就是整数,所以此时将字符1转为了数字1。0-9的字符都可通过这样转为0-9的数字。

更直接的解法:

class Solution {
public:
    int StrToInt(string str) {
        int sum = 0,temp = 0,sign = 1;
        //遍历字符串
        for(int i=0;i<str.size();i++){
            if(str[i] == '0') temp = 0;
            else if(str[i] == '1') temp = 1;
            else if(str[i] == '2') temp = 2;
            else if(str[i] == '3') temp = 3;
            else if(str[i] == '4') temp = 4;
            else if(str[i] == '5') temp = 5;
            else if(str[i] == '6') temp = 6;
            else if(str[i] == '7') temp = 7;
            else if(str[i] == '8') temp = 8;
            else if(str[i] == '9') temp = 9;
            
            else if(str[i] == '-') sign = -1;
            else if(str[i] == '+') sign = 1;
            
            else return 0;
            
            sum = sum * 10 + temp;
        }
        return sign * sum;
    }
};

python:

# -*- coding:utf-8 -*-
class Solution:
    def StrToInt(self, s):
        #字符串为空
        length = len(s)
        if length == 0:
            return 0
        #确定符号
        sign = 1#正负符号
        flag = 1#标志位,看s[0]是除数字0-9外的正负号还是字母,是正负号的时候为0,字母时为1
        if s[0] == '-':
            flag = 0
            sign = -1
            #s[0] = '0' #python中字符串是不可变对象,不能用下标赋值的方式去改变字符串 
        elif s[0] == '+':
            flag = 0
            sign = 1
            #s[0] = '0'
        #遍历字符串,进行转换    
        num = 0#最后返回的数字
        for i in range(length):
            #是数字时进行类型转换
            if s[i]>='0' and s[i]<='9':
                num = num*10 + (ord(s[i]) - ord('0'))#ord()函数得到其ascill
                #num = num*10 +int(s[i])#也可以直接用int()函数转换
            #除数字外判断是正负号还是字母,如果是正负号,从下一位开始;是字母则认为非法的数值表达,返回0
            else:
                if flag == 0:
                    continue
                else:
                    num = 0
                    break
        return num * sign
        #由于没有进行溢出判断,用例-2147483649对应输出应该为0,而此时却输出-2147483649,但状态显示答案正确

一个特别简单直接的方法

# -*- coding:utf-8 -*-
class Solution:
    def StrToInt(self, s):
            sum = 0
            temp = 0
            negaFlag = 1#符号
            for ss in s:
                if ss == "0":
                    temp = 0
                elif ss == "1":
                    temp = 1
                elif ss == "2":
                    temp = 2
                elif ss == "3":
                    temp = 3
                elif ss == "4":
                    temp = 4
                elif ss == "5":
                    temp = 5
                elif ss == "6":
                    temp = 6
                elif ss == "7":
                    temp = 7
                elif ss == "8":
                    temp = 8
                elif ss == "9":
                    temp = 9
                elif ss == "-":
                    negaFlag = -1
                elif ss == "+":
                    negaFlag = 1
                else:#除0-9的数字和正负号外的字母的情况
                    return 0
                sum += temp
                sum *= 10
            return negaFlag * sum / 10 #以+2456为例,最后得到的是24560,所以最后需要除以10

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值