【Java】 劍指offer(67) 把字符串轉換成整數


 

本文參考自《劍指offer》一書,代碼采用Java語言。

更多:《劍指Offer》Java實現合集  

題目

  請你寫一個函數StrToInt,實現把字符串轉換成整數這個功能。當然,不能使用atoi或者其他類似的庫函數。

思路

  題目很簡單,主要就是實現對每個字符轉化為數字,並進行累加即可。但是有很多特殊情況都需要考慮進去,例如null、空字符串、帶有正負號、字符不是數字、溢出等等。

  對於非法的特殊輸入,返回值為0,還要用一個全局變量進行標記。

  寫代碼時一定要考慮清楚各種測試用例。

 

 測試用例

  1.功能測試(正、負、零、帶有正負號的數字)

  2.邊界值測試(最大正整數,最小負整數)

  3.特殊測試(null,數空字符串,僅有正負號,非法字符)

Java代碼

  今天腦子有點亂,代碼總感覺不是很簡潔,有點繁瑣,但功能是完善的。

  附注:字符串如果僅有正負號這里認定為非法輸入

//題目:請你寫一個函數StrToInt,實現把字符串轉換成整數這個功能。當然,不
//能使用atoi或者其他類似的庫函數。

public class StringToInt {
    static boolean isValid = false;
    public static int strToInt(String str) {
        if(str == null || str.length()<=0)
            return 0;
        char[] chars = str.toCharArray();
        long num=0;  //先用long來存儲,以防止越界
        boolean minus=false;
        for(int i=0; i<chars.length; i++){
            if(i==0 && chars[i]=='-'){
                minus=true;
            }else if(i==0 && chars[i]=='+'){
                minus=false;
            }else{
                int a=(int) (chars[i]-'0');
                if(a<0 || a>9){
                    isValid=false;
                    return 0;
                }
                num= (minus==false) ? num*10+a : num*10-a;
                isValid=true;  //不放在最后面是為了防止str=‘+’的情況被判斷為true
                if((!minus && num>0x7FFFFFFF)
                   ||(minus && num<0x80000000)){
                    isValid=false;
                    return 0;
                }
            }
        }
        return (int)num;
    }
    
    //簡單測試下
    public static void main(String[] args) {
		System.out.println(strToInt("1948243")==1948243);
		System.out.println(isValid==true);
		System.out.println(strToInt("+1948243")==1948243);
		System.out.println(isValid==true);
		System.out.println(strToInt("-1948243")==-1948243);
		System.out.println(isValid==true);
		System.out.println(strToInt("-0")==0);
		System.out.println(isValid==true);
		System.out.println(strToInt("-194+8243")==0);
		System.out.println(isValid==false);
		System.out.println(strToInt("")==0);
		System.out.println(isValid==false);
		System.out.println(strToInt(null)==0);
		System.out.println(isValid==false);
		System.out.println(strToInt("999999999999999")==0);
		System.out.println(isValid==false);
		System.out.println(strToInt("+")==0);
		System.out.println(isValid==false);
		
		System.out.println(strToInt("2147483647")==2147483647); //0x7FFFFFFF
		System.out.println(isValid==true);
		System.out.println(strToInt("2147483648")==0);
		System.out.println(isValid==false);
		
		System.out.println(strToInt("-2147483648")==-2147483648); //0x80000000
		System.out.println(isValid==true);
		System.out.println(strToInt("-2147483649")==0);
		System.out.println(isValid==false);
	}
}

  

true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
StringToInt

 

收獲

  1.熟練掌握char類型轉化為int類型操作

  2.邊界值測試,記住int類型最大正整數為0x7FFFFFFF,最小負整數為0x80000000

  3.注意到了負號,也要注意到正號。

 

更多:《劍指Offer》Java實現合集  

 


免責聲明!

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



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