把字符串转换成整数
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
解题思路
这道题的意思就是判断这个字符串表示的是不是一个整数,字符串最前面可以有正负号,后面只能是数字,不能有字母或者其他符号。另外还要考虑溢出的问题,也就是说数字必须在[-2^31,2^31-1]之间。
- 第一步:判断第一位,不是数字的话只能是‘+’or‘-’且不能只有一位
- 第二步:从头开始遍历字符串,第一位是符号就跳过第一位,不是数字立即返回,同时计算整数
- 第三步:返回结果
计算的是整数的绝对值,所以若是正数必须<=2^31-1,若是负数必须<=2^31;
用一个变量limit记录这个边界,默认为2^31-1,负数的的时候要更新
function StrToInt(str)
{
if(str.length == 0) return 0
let res = 0,flag = 1
let limit = 2147483647 //2^31-1
let i=0
//若第一位不是数字,则必须是‘+’‘—’且不能只有一位
if(!(str[0]>'0'&&str[0]<'9')){
if(str[0]==='-'){
limit = 2147483648
flag = -1
}else if(str[0]!='+'){ //不是'-'就只能是'+'
return 0
}
if(str.length == 1) return 0
i++ //跳过符号位
}
let limitmin = limit/10 //针对res*10可能越界建立的变量
for(;i<str.length;i++){
if(!(str[i]>'0'&&str[i]<'9')){
return 0
}
//边界处理分为两步,因为这两步都可能越界
if(res>limitmin) return 0
res = res*10
if(res+(str[i]-'0')>limit) return 0 //str[i]-'0'把字符串转化为数字的方法
res = res+(str[i]-'0')
}
return res*flag
}