把字串轉換成整數(Java實現)

JacobGo發表於2017-05-19

本題為劍指offer面試題49

牛客網測試地址::https://www.nowcoder.com/questionTerminal/1277c681251b4372bdef344468e4f26e

  • 時間限制:1秒空間限制:32768K
將一個字串轉換成一個整數,要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是一個合法的數值則返回0
輸入描述:
輸入一個字串,包括數字字母符號,可以為空


輸出描述:
如果是合法的數值表達則返回該數字,否則返回0

輸入例子:
+2147483647
    1a33

輸出例子:
2147483647
    0


package go.jacob.day519;

/*
 * [程式設計題]把字串轉換成整數
 * 三個易錯點:
 * 1.考慮異常輸入;
 * 2.異常輸入和'0'的返回值都為0,應該設定一個全域性變數來區分;
 * 3.判斷字串輸入的第一位是不是正負號;
 * 4.考慮整數的上下溢位。Integer.MAX_VALUE (2^31-1)  Integer.MIN_VALUE(-2^31)
 * 
 * 關於判斷是否溢位的問題
 * 本人認為java熱門第一判斷是否溢位是錯誤的,舉個反例
 * 當輸入為value=2147483648時,在計算機內部的表示應該是-2147483648
 * 顯然value>Integer.MAX_VALUE是不成立的
 * 
 */
public class Demo2 {
	public static void main(String[] args) {
		String str = "-2147483648";
		System.out.println(StrToInt(str));
		System.out.println(flag);

	}

	// 設定一個全域性變數,來判斷:當輸出為0時,是字串輸入異常還是輸入字串為'0'
	public static boolean flag;

	public static int StrToInt(String str) {
		flag = false;
		//判斷輸入是否合法
		if (str == null || str.trim().equals("")) {
			flag = true;
			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') {
				flag = true;
				return 0;
			}
			result = result * 10 + (int) (chars[i] - '0');
			System.out.println("1:" + result);
			/*
			 * 本人認為java熱門第一判斷是否溢位是錯誤的,舉個反例
			 * 當輸入為value=2147483648時,在計算機內部的表示應該是-2147483648
			 * 顯然value>Integer.MAX_VALUE是不成立的
			 */

			if ((symbol == 0 && result < 0) || (symbol == 1 && result < 0 && result > Integer.MIN_VALUE)) {
				flag = true;
				return 0;
			}
		}

		// 注意:java中-1的n次方不能用:(-1)^n .'^'異或運算
		// 注意,當value=-2147483648時,value=-value
		result = (int) Math.pow(-1, symbol) * result;

		return result;
	}
}





相關文章