【劍指Offer】49、把字符串轉換成整數


  題目描述:

  將一個字符串轉換成一個整數(實現Integer.valueOf(string)的功能,但是string不符合數字要求時返回0),要求不能使用字符串轉換整數的庫函數。 數值為0或者字符串不是一個合法的數值則返回0。

  輸入輸出描述:

  輸入一個字符串,包括字母、數字、符號,可以為空。如果是合法的數值表達則返回該數字,否則返回0。

  解題思路:

  本題解決起來並不困難,功能實現簡單,但是主要的問題是能否把各種不同的特殊情況都考慮進去,也就是代碼的魯棒性和思考的全面,比如空指針、空字符串、正負號、溢出等等問題。

  主要需要注意的點有以下幾個:

  • 字符串是否為null或者字符串是否為空字符串。
  • 字符串對於正負號的處理,特別是正號,可能有也可能沒有,但都代表正數
  • 輸入值是否合法,判斷除首位可能為正負號外,其他位是否都是數字
  • int為32位,最大的整數是剛剛超過21億,也就是10位十進制數
  • 使用錯誤標志,區分合法值0和非法值0

  以下直接給出相應的代碼實現。

  編程實現(Java):

public class Solution {
    public int StrToInt(String str) {
        if(str==null || str.length()<1)
            return 0;
        boolean isVaild=false; //用來標記是否合法
        char c = str.charAt(0);
        int flag=0;
        //通過首位進行判斷,並標記
        if(c=='+') //為正數
            flag=1;
        else if(c=='-') //為負數
            flag=-1;
        else if(c>='0'&&c<='9') { //正數
            flag=1;
            str="+"+str; //便於統一處理
        }else { //不是數
            isVaild=true;
             return 0;
        }
           
        int len= str.length();
        
        //計算后續數字
        if(len>11) //最大整數是10位
            return 0;
        long res=0;
        for(int i=1;i<len;i++){
            c=str.charAt(i);
            if(c<'0'||c>'9'){
                isVaild=true;
                return 0;
            }
               
            res=res*10+(c-48); //計算數值大小
        }
        if(flag==1 && res<=Integer.MAX_VALUE)
            return (int)res;
        if(flag==-1 && (-1*res)>=Integer.MIN_VALUE)
            return (int)(-1*res);
        isVaild=true;
        return 0;
    }        
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM