题解 | #把字符串转换成整数(atoi)#
把字符串转换成整数(atoi)
http://www.nowcoder.com/practice/d11471c3bf2d40f38b66bb12785df47f
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
public int StrToInt (String s) {
// write code here
// 这道题,我算是明白了,你每进行一次切分之后,就判断是否为空串,不然老是报越界的问题
// 去掉无用的前导空格和无用的后导空格(如果有)
s = s.trim();
// 一些特殊情况的处理
// "" " "
if ("".equals(s)) {
return 0;
}
// 取出第一个字符
char chr = s.charAt(0);
// 如果第一个非空字符不是如下三种字符之一,那么直接返回 0
if (!(chr == '+' || chr == '-' || (chr >= '0' && chr <= '9'))) {
return 0;
}
int sign = 1; // 定义一个整型变量,用于存放符号位。1:正数 -1:负数
if (chr == '-') { // 除非是负数,否则符号位不需要改变(默认是正数)
sign = -1;
}
String tmpStr = null; // 定义一个 String 类型的变量,用于获取整数的有效部分
// 截取符号位(如果有)
if (chr == '+' || chr == '-') {
tmpStr = s.substring(1);
}
else {
tmpStr = s;
}
// "+" "-"
if ("".equals(tmpStr)) {
return 0;
}
int index = tmpStr.length(); // 截取的位置
for (int i = 0; i < tmpStr.length(); i++) {
if (tmpStr.charAt(i) < '0' || tmpStr.charAt(i) > '9') {
index = i;
break;
}
}
tmpStr = tmpStr.substring(0, index); // 截取有效的整数部分
// "+-5"
if ("".equals(tmpStr)) {
return 0;
}
// 把 tmpStr 前面的 0,全部切分出去
index = 0;
for (int i = 0; i < tmpStr.length(); i++) {
if (tmpStr.charAt(i) != '0') {
break;
}
index++;
}
tmpStr = tmpStr.substring(index);
if ("".equals(tmpStr)) {
return 0;
}
// 这里要限制一下 tmpStr 的长度。如果 tmpStr 的长度长到 long 类型都装不下,直接返回
if (tmpStr.length() > "2147483647".length()) {
if (sign == -1) {
return (int)(-Math.pow(2, 31));
}
else {
return (int)(Math.pow(2, 31) - 1);
}
}
long tmpValue = Long.valueOf(tmpStr);
tmpValue = tmpValue * sign; // 别忘了乘上符号位!!!
// 定义一个整型变量,用于存放最终的返回结果
int rs = 0;
// 如果整数超过了 int 类型的范围,就要进行截取
if (tmpValue > Math.pow(2, 31) - 1) {
rs = (int)(Math.pow(2, 31) - 1);
}
else if (tmpValue < -Math.pow(2, 31)) {
rs = (int)(-Math.pow(2, 31));
}
else {
rs = (int)tmpValue;
}
return rs;
}
}