這看起來是很簡單的題目,實現(xiàn)基本功能 ,大部分人都能用10行之內(nèi)的代碼解決??墒?,當我們要把很多特殊情況即測試用例都考慮進去,卻不是件容易的事。解決數(shù)值轉(zhuǎn)換問題本身并不難,但我希望在寫轉(zhuǎn)換數(shù)值的代碼之前,應聘者至少能把空指針,空字符串”“,正負號,溢出等方方面面的測試用例都考慮到,并且在寫代碼的時候?qū)@些特殊的輸入都定義好合理的輸出。當然,這些輸出并不一定要和atoi完全保持一致,但必須要有顯式的說明,和面試官溝通好。
這個應聘者最大的問題就是還沒有養(yǎng)成在寫代碼之前考慮所有可能的測試用例的習慣,邏輯不夠嚴謹,因此一開始的代碼只處理了最基本的數(shù)值轉(zhuǎn)換。后來我每次提醒他一處特殊的測試用例之后,他改一處代碼。盡管他已經(jīng)做了兩次修改,但仍然有不少很明顯的漏洞,特殊輸入空字符串”“,邊界條件比如最大的正整數(shù)與最小的負整數(shù)等。由于這道題思路本身不難,因此我希望他把問題考慮得極可能周到,代碼盡量寫完整。
public class Test49 {
/**
* 題目:實現(xiàn)一個函數(shù)stringToInt,實現(xiàn)把字符串轉(zhuǎn)換成整數(shù)這個功能,
* 不能使用atoi或者其他類似的庫函數(shù)。
*
* @param num
* @return
*/
public static int stringToInt(String num) {
if (num == null || num.length() < 1) {
throw new NumberFormatException(num);
}
char first = num.charAt(0);
if (first == '-') {
return parseString(num, 1, false);
} else if (first == '+') {
return parseString(num, 1, true);
} else if (first <= '9' && first >= '0') {
return parseString(num, 0, true);
} else {
throw new NumberFormatException(num);
}
}
/**
* 判斷字符是否是數(shù)字
*
* @param c 字符
* @return true是,false否
*/
private static boolean isDigit(char c) {
return c >= '0' && c <= '9';
}
/**
* 對字符串進行解析
*
* @param num 數(shù)字串
* @param index 開始解析的索引
* @param positive 是正數(shù)還是負數(shù)
* @return 返回結(jié)果
*/
private static int parseString(String num, int index, boolean positive) {
if (index >= num.length()) {
throw new NumberFormatException(num);
}
int result;
long tmp = 0;
while (index < num.length() && isDigit(num.charAt(index))) {
tmp = tmp * 10 + num.charAt(index) - '0';
// 保證求的得的值不超出整數(shù)的最大絕對值
if (tmp > 0x8000_0000L) {
throw new NumberFormatException(num);
}
index++;
}
if (positive) {
if (tmp >= 0x8000_0000L) {
throw new NumberFormatException(num);
} else {
result = (int) tmp;
}
} else {
if (tmp == 0x8000_0000L) {
result = 0x8000_0000;
} else {
result = (int) -tmp;
}
}
return result;
}
public static void main(String[] args) {
// System.out.println(Integer.parseInt(Integer.MIN_VALUE + ""));
// System.out.println(0x8000_0000L);
// System.out.println(stringToInt(""));
System.out.println(stringToInt("123"));
System.out.println(stringToInt("+123"));
System.out.println(stringToInt("-123"));
System.out.println(stringToInt("1a123"));
System.out.println(stringToInt("+2147483647"));
System.out.println(stringToInt("-2147483647"));
System.out.println(stringToInt("+2147483648"));
System.out.println(stringToInt("-2147483648"));
// System.out.println(stringToInt("+2147483649"));
// System.out.println(stringToInt("-2147483649"));
// System.out.println(stringToInt("+"));
// System.out.println(stringToInt("-"));
}
}
http://wiki.jikexueyuan.com/project/for-offer/images/66.png" alt="" />