今天听室友说去京东面试,面试官出了一道算法题,说是让编程实现将字符串转成整形,室友大意了,跪在了算法上。故为室友写下了此文,希望能帮到同样在找工作的小伙伴们。
题目大意:
实现一个atoi函数,将字符串转成整形 。要点:考虑所有的输入情况。
解题思路:
【1】首先判断它是否为空,若是,直接返回相应的结果或者抛异常,(这里我选择抛异常,大家也可以约定好返回的结果值,记得注意区分就行)否则进行下面【2】的操作;
【2】判断输入字符串是否合法,首字母可以为符号位,其余位只能是数字;若不合法,直接返回约定好的值或者选择抛异常;
【3】到了该步,说明字符串合法,可以开始转换;
【4】判断计算的结果值是否溢出。
代码实现:
/**
* 字符串转整形。
*/
public class String2Integer {
public int string2int(String str) throws NumberFormatException{
int index = 0;//游标
boolean flag = true;//符号标记位,默认为true
long result = 0;//返回最终结果
//【1】首先判断它是否为空,若是,直接返回相应的结果或者抛异常,否则进行下面【2】的操作
if (str == null) {
throw new NumberFormatException("Invalid input string: null" + str);
}
if (str.length() == 0) {
throw new NumberFormatException("Invalid input string,the length is : " + str.length());
}
//【2】判断输入字符串是否合法
if (!isLegal(str)) {
throw new NumberFormatException("Invalid input string:" + str);
}
//【3】到了该步,说明字符串合法,可以开始转换
if (str.charAt(0) == '-' || str.charAt(0) == '+') {
result = convert(str.substring(1));
}else {
result = convert(str);
}
if (result > 0 && str.charAt(0) == '-') result = -result;
if (result < Integer.MIN_VALUE) {
throw new NumberFormatException("Invalid input string: Underflow");
}
return (int) result;
}
/**
* 将合法的字符串进行转化成整形。
* @param str
* @return
*/
private long convert(String str) {
long result = 0;
for (int i = 0; i < str.length(); i++) {
result = result * 10 + (str.charAt(i) - '0');
if (result > Integer.MAX_VALUE) {
throw new NumberFormatException("Invalid input string: Overflow");
}
}
return result;
}
/**
* 判断字符串是否合法。
*
* @param str
* @return
*/
private boolean isLegal(String str) {
boolean flag = false;
char c = str.charAt(0);//首字符
//只有一个字符且为非法字符
if (str.length() == 1 ) {
if (c <= '0' && c >= '9') {
throw new NumberFormatException("Invalid input string: " + str);
}else {
return true;
}
}else {//从第二个字母开始判断是否为数字
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) >= '0' && str.charAt(i) <= '9') {
flag = true;
} else {
flag = false;
return flag;
}
}
}
return flag;
}
}
/**
测试用例
*/
import com.lm.main.String2Integer;
import org.junit.Test;
import static org.junit.Assert.*;
public class String2IntegerTest extends String2Integer {
@Test
public void string2int() throws Exception {
String2Integer string2Integer = new String2IntegerTest();
assertEquals(123456, string2Integer.string2int("123456"));
assertEquals(-123456, string2Integer.string2int("-123456"));
assertEquals(0, string2Integer.string2int("0"));
}
}
感想:
此题看似简单,其实主要考察大家考虑问题是否全面细心,这也是作为一名合格的程序猿所必备的一项技能。此外,leetcode上有关于这道题的有奖征答,奖励100美金哦,欢迎诸位大神指教。