import org.omg.CORBA.INTERNAL;
/**
* 面试题67:把字符串转换成整数
* 题目:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
* 输入:"+2147483647"
* 输出:2147483647
*
* 输入:"1a33"
* 输出:0
*
* @author
* @create 2021-05-03 22:39
*/
public class Solution67 {
public static void main(String[] args) {
}
/**
* 方法一:捕捉异常,使用包装类解析字符串,如果类型不匹配就返回0,匹配就返回结果
* @param str
* @return
*/
public static int strToInt(String str) {
if (str == null || str.equals("")){
return 0;
}
try {
int res = Integer.parseInt(str);
return res;
}catch (NumberFormatException e){
e.printStackTrace();
return 0;
}
}
/**
* 方法二:正则表达式判断格式 + 结果溢出判断
* @param str
* @return
*/
public static int strToIntTwo(String str){
//不符合正则匹配表达的返回0
// \d代表[0-9] 但是要写成\\d才行。[] 字符集。匹配包含的任一字符. ?零次或一次匹配前面的字符或子表达式
// + 一次或多次匹配前面的字符或子表达式
if (!str.matches("[+,-]?\\d+")){
return 0;
}
//接下来判断是否越界
int len = str.length();
int i = len - 1;
long res = 0;//long类型,避免溢出。不能用int
//保证字符串中的每个字符都在0~9之间,这个判断是因为第0位可能是符号位,如果是符号位就退出循环
while (i >= 0&& str.charAt(i) >= '0' && str.charAt(i) <= '9'){
res += Math.pow(10, len - 1 - i) * (str.charAt(i) - '0');
i--;
}
res = str.charAt(0) == '-' ? -res : res;
//溢出就返回0,用long类型的res来比较,
//如果定义为int res,那再比较就没有意义了,int范围为[-2147483648,2147483647]
if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE){
return 0;
}
return (int) res;
}
/**
* 方法三:
* @param str
* @return
*/
public static int strToIntThree(String str){
if (str == null || str.trim().equals("")){
//trim()用于删除字符串的头尾空白符
return 0;
}
str = str.trim();
int i = 0;
int flag = 1;
int res = 0;
if (str.charAt(i) == '-'){
flag = -1;
}
if (str.charAt(i) == '+' || str.charAt(i) == '-'){
i++;
}
while (i < str.length()){
if (str.charAt(i) >= '0' && str.charAt(i) <= '9'){
int cur = str.charAt(i) - '0';
if (flag == 1 && (res > Integer.MAX_VALUE/10 || res == Integer.MAX_VALUE/10 && cur > 7)){
return 0;
}
if (flag == -1 && (res > Integer.MAX_VALUE/10 || res == Integer.MAX_VALUE/10 &&cur > 8)){
return 0;
}
res = res*10 + cur;
i++;
}else {
return 0;
}
}
return res * flag;
}
/**
* 方法三简洁的写法
* @param str
* @return
*/
public static int strToIntFour(String str){
if (str == null || str.trim().equals("")){
//trim()用于删除字符串的头尾空白符
return 0;
}
int length = str.length();
int isNegtive = 1, overValue = 0;
int digit = 0, value = 0;
int index = 0;
if (str.charAt(index) == '-'){
isNegtive = -1;
index++;
}else if (str.charAt(index) == '+'){
index++;
}
while (index < length){
digit = str.charAt(index) - '0';
// overValue表示当前的值和Integer.MAX_VALUE/10的差,因为Integer.MAX_VALUE/10为正数,
// 所以当当前值为负数时,需要统一转化为正数.
// 当 overValue > 0 时,越界,overValue < 0 时,不越界,而当 overValue == 0 时:
// 正数时(isNegtive == 1),digit > 7 越界,负数时(isNegtive == -1),digit > 8 越界
// digit 的判断统一转化为: ((isNegtive + 1) / 2 + digit) > 8
overValue = isNegtive * value - Integer.MAX_VALUE / 10 +
(((isNegtive + 1) / 2 + digit) > 8 ? 1: 0);
if (digit < 0 || digit > 9){
return 0;
}else if(overValue >0){
return 0;
}
value = value * 10 + isNegtive * digit;
index++;
}
return value;
}
}
【剑指Offer】面试题67:把字符串转换成整数
最新推荐文章于 2022-02-17 15:12:01 发布