兩道關於數字轉換的題
阿新 • • 發佈:2017-11-02
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類型的應用
兩道關於數字轉換的題