【解题报告】【lintcode54】String to Integer II
题意
一个字符串中间含有一个整数数字,找出他,并转为数字返回
解答
主要分为三步来求解
1.使用正则表达式匹配字符串,看是否有符合条件的子串
2.根据匹配结果,再根据符号,小数点的位置确定执行操作串的长度和开始位置
3.对于每一个操作子串的字符进行处理,并加到结果上,最后处理边界和符号
代码
public class Solution {
/**
* @param str: A string
* @return An integer
*/
int num = 0;
boolean flag;
boolean isMax = false;
int dig;
public int atoi(String str) {
str = str.trim();
str = hasNumber(str);//正则匹配
if (str == null)
return 0;
flag = true;//开始处理长度
int dot = str.indexOf(".");
int fd = str.indexOf("-");
int fp = str.indexOf("+");
int len;
if (dot >= 0)
len =dot;
else
len = str.length();
if (fd >= 0 || fp >= 0)
{
len--;
}
dig = len;
int leng = str.length();
if (dot > 0)
leng = dot;//处理长度结束
for (int i = 0;i < leng;i++)//开始处理每一位
{
if (!isMax)
deal(str.charAt(i));
else
break;
}
if (isMax)
return num;
if (!flag)
num *= -1;
return num;//结束处理返回结果
}
//字符处理
public void deal(char c){
if (c == '-'){
flag = false;
return;
}
if (c == '+'){
flag = true;
return;
}
if (num >= 0&& (num += (c-'0')*(int)Math.pow(10,dig-1)) < 0) {
isMax = true;
if (flag)
num = 2147483647;
else
num = -2147483648;
}
dig--;
}
//正则匹配函数
public String hasNumber(String s){
String patterns ="[+,-]*[0-9]+[.]{0,1}[0]*";
Pattern pattern = Pattern.compile(patterns);
Matcher m = pattern.matcher(s);
if (m.find()){
patterns ="[+,-]{0,1}[0-9]+[.]{0,1}[0]*";
pattern = Pattern.compile(patterns);
String s1 = m.group(0);
m = pattern.matcher(m.group(0));
if (m.matches())
return s1;
else
return null;
}
else
return null;
}
}