题目
请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。
回到顶部
思路
题目很简单,主要就是实现对每个字符转化为数字,并进行累加即可。但是有很多特殊情况都需要考虑进去,例如null、空字符串、带有正负号、字符不是数字、溢出等等。
对于非法的特殊输入,返回值为0,还要用一个全局变量进行标记。
写代码时一定要考虑清楚各种测试用例。
package offer;
import org.junit.Test;
/**
* 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),
* 要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
* @author kankan
* @creater 2019-07-24 20:16
*/
public class Solution67 {
public int StrToInt(String str) {
//判断输入是否合法
if (null == str || str.trim().equals("")){
return 0;
}
// symbol=0,说明该数为正数;symbol=1,该数为负数;start用来区分第一位是否为符号位
int symbol = 0;
int start = 0;
char[] chars = str.trim().toCharArray();
if ('+' == chars[0]){
start = 1;
}else if ('-' == chars[0]){
start = 1;
symbol = 1;
}
int result = 0;
for (int i = start; i < chars.length; i++) {
if (chars[i] > '9' || chars[i] < '0'){
return 0;
}
int sum = result * 10 + (int) (chars[i] - '0');
if ((sum - (int)(chars[i] - '0')) / 10 != result){
return 0;
}
result=result * 10 + (int) (chars[i] - '0');
/*
* 本人认为java热门第一判断是否溢出是错误的,举个反例
* 当输入为value=2147483648时,在计算机内部的表示应该是-2147483648
* 显然value>Integer.MAX_VALUE是不成立的
*/
}
// 注意:java中-1的n次方不能用:(-1)^n .'^'异或运算
// 注意,当value=-2147483648时,value=-value
result = (int) Math.pow(-1, symbol) * result;
return result;
}
// 1.功能测试(正、负、零、带有正负号的数字)
@Test
public void testA(){
System.out.println(new Solution67().StrToInt("1948243")==1948243);
System.out.println(new Solution67().StrToInt("+1948243")==1948243);
System.out.println(new Solution67().StrToInt("-1948243")==-1948243);
System.out.println(new Solution67().StrToInt("-0")==0);
}
// 2.边界值测试(最大正整数,最小负整数)
@Test
public void testB(){
String str = "+2147483647";
int strToInt = new Solution67().StrToInt(str);
System.out.println(strToInt);
String str1 = "-2147483648";
int strToInt1 = new Solution67().StrToInt(str1);
System.out.println(strToInt1);
}
// 3.特殊测试(null,数空字符串,仅有正负号,非法字符)
@Test
public void testC(){
System.out.println(new Solution67().StrToInt(""));
System.out.println(new Solution67().StrToInt(null));
System.out.println(new Solution67().StrToInt("1a33"));
System.out.println(new Solution67().StrToInt("+++"));
}
}