1. 程式人生 > >兩道關於數字轉換的題

兩道關於數字轉換的題

nbsp index 累加 停止 cnblogs 其中 times 數字 取字符

一 java實現atoi()

* atoi()描述:
* 參數str字符串,如果第一個非空格字符存在,是數字或者正負號則開始做類型轉換, 之後檢測到非數字(包括結束符 \0) 字符時停止轉換,返回整型數。否則,返回零。
下面是leetcode社區Discuss版面的兩個解決方案:

方案1:

public static int myAtoi(String str) {
	    int index = 0, sign = 1, total = 0;
	    //1. 如果為空
	    if(str.length() == 0) return 0;
	    
	    //2. 移除前置空格
	    str = str.trim();

	    //3. 檢查符號位
	    if(str.charAt(index) == ‘+‘ || str.charAt(index) == ‘-‘){
	        sign = str.charAt(index) == ‘+‘ ? 1 : -1;
	        index ++;
	    }
	    
	    //4. 轉換成數字並避免溢出
	    while(index < str.length()){
	        int digit = str.charAt(index) - ‘0‘;
	        if(digit < 0 || digit > 9) break;//如果該位符號不是0-9則停止轉換

	        //檢查加和數是否溢出
	        //check if total will be overflow after 10 times and add digit
	        //如果溢出,正數返回Integer類型的最大值,附屬返回Integer類型的最小值
	        //其中Integer.MAX_VALUE是Integer的最大值,Integer.MIN_VALUE是Integer的最小值
	        if(Integer.MAX_VALUE/10 < total || Integer.MAX_VALUE/10 == total && Integer.MAX_VALUE %10 < digit)
	            return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
	        //沒有溢出,則繼續累加
	        total = 10 * total + digit;
	        index ++;
	    }
	    return total * sign;
	}

方案2:

public static int myAtoi1(String str) {
		//判斷非空
		if (str == null || str.length() == 0)
			return 0;
		//去空格
		str = str.trim();
		char firstChar = str.charAt(0);
		int sign = 1, start = 0, len = str.length();
		long sum = 0;
		if (firstChar == ‘+‘) {
			sign = 1;
			start++;
		} else if (firstChar == ‘-‘) {
			sign = -1;
			start++;
		}
		for (int i = start; i < len; i++) {
			if (!Character.isDigit(str.charAt(i)))
				return (int) sum * sign;
			sum = sum * 10 + str.charAt(i) - ‘0‘;
		    //判斷溢出
			if (sign == 1 && sum > Integer.MAX_VALUE)
				return Integer.MAX_VALUE;
			if (sign == -1 && (-1) * sum < Integer.MIN_VALUE)
				return Integer.MIN_VALUE;
		}

		return (int) sum * sign;
	}

其實二者的主要思路都是差不多的:

1 判斷str是否為空,為空則返回0

2 去空格,用str.trim()能去掉str字符串前後的空格和換行等

3 判斷字符類型(正負號)

4 循環取出數字並累加。跳出循環條件有三個:

①最新讀取的字符不是0-9

②累加結果上溢出或者下溢出

③讀取字符串完畢

二 翻轉數字

反轉數字的整數。

Example1: x = 123,return 321
Example2: x = -123,return -321

  public int reverse(int x) {
    int result = 0;

    while (x != 0)
    {
        int tail = x % 10;
        int newResult = result * 10 + tail;
        if ((newResult - tail) / 10 != result)
        { return 0; }
        result = newResult;
        x = x / 10;
    }
    return result;
}

總結:兩個放在一起主要原因是自己做這些題的時候會忽略溢出問題,註意溢出判斷和Integer類型的應用

兩道關於數字轉換的題