一 题目
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为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