剑指offer43--字符串转化成整数

时间:2023-01-07 09:07:49


一、题目


题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能,不能使用atoi或者其他类似的库函数。



二、思想


(1)使用字符串的方法charAt( )来对字符串进行操作
(2)本题目其实考察的不是简单的转换,而是对思想全面性的考察
(3)考察的是能否注意到所有可能抛出异常的情况
(4)正负、是否都为数字、最大范围等


三、程序



package 剑指offer;

/*题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能,不能使用atoi或者其他类似的库函数。*/
public class Test49 {

public static int stringToInt(String num){
// 边界条件判断
if(num == null || num.length() < 1){
throw new NumberFormatException();
}

char first = num.charAt(0);
// 为了避免冗余,使用下面条件选择的方式
if(first == '-'){
return parseString(num, 1, false);
}else if(first == '+'){
return parseString(num, 1, true);
}else if(first >= '0' && first <= '9'){
return parseString(num, 0, true);
}else{
throw new NumberFormatException();
}
}

// 判断是不是数字
private static boolean isDigit(char c) {
return c >= '0' && c <= '9';
}

// 真正的对字符串进行转换,主要使用的方法是charAt()
public static int parseString(String num, int index, boolean i){
if(index >= num.length()){
throw new NumberFormatException();
}

int result = 0;
long temp = 0;

while(index < num.length() && isDigit(num.charAt(index))){
temp = temp * 10 + (num.charAt(index) - '0');
if (temp > 0x8000_0000L) {
throw new NumberFormatException(num);
}
index++;
}
// 判断数据的正负
if(i){
if(temp > 0x8000_0000L){
throw new NumberFormatException(num);
}else{
result = (int)temp;
}
}else {
if (temp == 0x8000_0000L) {
result = 0x8000_0000;
} else {
result = (int) -temp;
}
}
return result;
}


public static void main(String[] args) {
System.out.println(stringToInt("123"));
System.out.println(stringToInt("+123"));
System.out.println(stringToInt("-123"));
System.out.println(stringToInt("1a123"));
System.out.println(stringToInt("+1233456"));
System.out.println(stringToInt("-1232424"));
System.out.println(stringToInt("+++"));
System.out.println(stringToInt("---"));
}
}