描述
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
1.若干空格
2.(可选)一个符号字符(‘+’ 或 ‘-’)
3. 数字,字母,符号,空格组成的字符串表达式
4. 若干空格
转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3 整数超过 32 位有符号整数范围 [−2 ^31, 2 ^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2 ^31的整数应该被调整为 -2 ^31,大于 2 ^31 − 1 的整数应该被调整为 2 ^31− 1
4.去掉无用的后导空格
数据范围:
1.0 <=字符串长度<= 100
2.字符串由英文字母(大写和小写)、数字(0-9)、’ ‘、’+‘、’-’ 和 ‘.’ 组成
示例1
输入:"82"
返回值:82
示例2
输入:" -12 "
返回值:-12
说明:
去掉前后的空格,为-12
示例3
输入:"4396 clearlove"
返回值:4396
说明:
6后面的字符不属于有效的整数部分,去除,但是返回前面提取的有效部分
示例4
输入:"clearlove 4396"
返回值:0
示例5
输入:"-987654321111"
返回值:-2147483648
思路:最普通的字符串遍历法。首先去除空格,然后遍历每个值,这里的难点就是端点值的问题,先判断,然后利用上一轮的值与端点少一位数值的值进行比较,并与上当前值的大小判断,从而得到是否大于端点值;
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
public int StrToInt (String s) {
// write code here
int result = 0;
int unsignedFlag = 1; // 符号
boolean flag = true;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ' && flag) continue;
else {
if (flag) { // 第一个字符,为符号
flag = false;
if (s.charAt(i) == '-') {
unsignedFlag = -unsignedFlag;
continue;
}else if(s.charAt(i)=='+') continue;
} // 第一个字符
if (s.charAt(i) >= '0' && s.charAt(i) <= '9' ) {
if ((unsignedFlag * result ==( Integer.MAX_VALUE)/10 && (s.charAt(i)-'0')>Integer.MAX_VALUE%10) || (unsignedFlag * result >( Math.pow(2,
31) - 1)/10 ))return Integer.MAX_VALUE;
else if ((unsignedFlag * result == Math.pow(-2,
31)/10 && (s.charAt(i)-'0')>-(Integer.MIN_VALUE%10)) || (unsignedFlag * result< Math.pow(-2,
31)/10)) return Integer.MIN_VALUE;
result = result*10 + (s.charAt(i) - '0');
} else break;
}
}
return unsignedFlag * result;
}
}