一、题目
实现 atoi
,将字符串转为整数。
在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
二、思路
这个题目是一个比较简单的字符串处理题目,将处理好的字符串转化为整数,只是需要考虑的情况比较多。
要考虑的情况包括下面这些:
1、字符串为空
2、字符串开头有空格
3、过滤掉字符串开头空格后字符串变为空串
4、字符串是以数字开头、正负号开头、或者其他字符开头
以上情况就把特殊情况包含进去了,接下来是处理数字字符串的情况,处理以上情况后我们能得到一个新的字符串,字符串开头为我们要转化的数字,这时我们要考虑一下情况:
1、数字字符串为空串
2、数字字符串以0开头
3、数字字符串过滤掉开头0以后变为了空串
处理了以上情况后我们就得到了要转化为数字的字符串,要求这个数字在Int范围内,因为长度超过10的都可以pass,其他的直接用long来转化,再与int范围进行比较进行相应输出。
三、代码
public class LeetCode8 {
public static void main(String[] args){
String s ="4793 with";
System.out.print(myAtoi(s));
}
public static int myAtoi(String str) {
if (str.length() < 1){
return 0;
}
//过滤字符串开头空格
int pos = 0;
while (pos < str.length() && str.charAt(pos) == ' '){
pos++;
}
str = str.substring(pos, str.length());
//过滤空串
if ("".equals(str)) {
return 0;
}
//数据为正或负 true为正
boolean operator = true;
String numString;
//字符串开头非数字情况
if (str.charAt(0) < '0' || str.charAt(0) > '9') {
//非+或者-不合法返回0
if (str.charAt(0) != '+' && str.charAt(0) != '-') {
return 0;
}
//数字为负数
if (str.charAt(0) == '-') {
operator = false;
}
//获取数值
numString = getNumStr(str.substring(1, str.length()));
} else {
numString = getNumStr(str);
}
//过滤数据部分为空串的情况
if ("".equals(numString)) {
return 0;
}
//过滤掉数据超出long的情况
if (numString.length() > 10) {
if (operator) {
return Integer.MAX_VALUE;
} else {
return Integer.MIN_VALUE;
}
}
//转化数值
long num = Long.parseLong(numString);
if (!operator) {
num = -num;
}
//根据结果范围返回数值
if (num < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
if (num > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
return (int) num;
}
/**
* 截取字符串的开头数值
*
* @param s 字符串
* @return 数值字符串
*/
private static String getNumStr(String s) {
StringBuilder num = new StringBuilder();
boolean isStart = true;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
if (isStart && s.charAt(i) == '0') {
continue;
}
isStart = false;
num.append(s.charAt(i));
} else {
break;
}
}
return num.toString();
}
}
四、总结