1. 程式人生 > >每日LeetCode之 字串轉整數(atoi)

每日LeetCode之 字串轉整數(atoi)

解決方案:

        public int myAtoi(String str) {
            if(str.isEmpty()) 
                return 0;
            int flag =1,i=0;
            long result = 0;
            //判斷空字元的個數,並且確定空字元結束的位置
            while(i < str.length() && str.charAt(i) == ' ')
                i++;
            //如果統計的空字元個數與字串長度相同,則判斷為這個空字元,不能轉換
            if(i == str.length())
                return 0;
            //由於上面是i++,所以此時i為空字元之後的第一個非空字元的索引值,此位置判斷為
            //flag為正還是負的位置,並分別賦值
            if (str.charAt(i) == '+' || str.charAt(i) == '-'){
                flag = str.charAt(i)=='+'? 1 : -1;
                i++;
            }
            //過去這符號位之後,應該是判斷是否是數字字元,如果不是則不會執行下面的for迴圈,
            //並且下一位不是數字則其不會再進行while迴圈
            while(i < str.length() && str.charAt(i) >= '0'&& str.charAt(i)<='9'){
                result = 10 * result + (str.charAt(i++) -'0');
                //判斷是否發生了溢位,超出了所給的位置
                if(result > Integer.MAX_VALUE){
                    return flag==1?Integer.MAX_VALUE:Integer.MIN_VALUE;
                }
            }
            return Integer.parseInt(String.valueOf(result * flag));
        }

演算法的主要核心還是在於對於字串的位置移動的考慮,當然也可以通過StringBuffer來實現:

        public int myAtoi(String str) {
            if(str.isEmpty()) 
                return 0;
            int flag =1,start = 0;
            long result = 0;
            char[] ch = str.trim().toCharArray();
            StringBuffer buf = new StringBuffer();
            if(ch.length == 0){
                return 0;
            }
            if(ch[0] =='+' || ch[0] =='-'){
                flag = ch[0] =='+' ? 1 : -1;
                start = 1;
            }
            
            for(int i = start; i<ch.length; i++){
                if(ch[i] >= '0' && ch[i] <= '9'){
                    //result = result * 10 + ch[i] - '0';
                    buf.append(ch[i]);
                }else
                    break;
                
                result = Long.parseLong(buf.toString());
                if(result > Integer.MAX_VALUE){
                      return flag==1?Integer.MAX_VALUE:Integer.MIN_VALUE;
                  }
            }
            if(buf.length() == 0){
                buf.append(0);
                result = Long.parseLong(buf.toString());
            }       
            return Integer.parseInt(String.valueOf(result * flag));
        }

這個解決方法則是將符合的數字利用一個buf儲存,然後轉換為String在進行整數轉換,所以,當首字元為字母是,其長度為0,所以需要增加一個判斷是否為零,輸出為0的分支,而且判斷溢位則最好是在for迴圈裡面,否則數字太大了沒有任何一種資料可以容納時,則就會出現報錯,所以可以在迴圈的過程中發現溢位了就判斷返回溢位對應帶的輸出情況就好。