小聲BB幾句:好久沒有動手寫博客了,因爲覺得自己一直在給搜索引擎製造垃圾(相似的內容,前輩們都寫過啦)。後來還是想通了,當成是自己的線上筆記吧。
問題:
實現一個方法,輸入爲一個字符串,輸出爲字符串轉成的double類型的數字。如果字符串中存在非法字符,拋出異常。
分析:
這個問題是餓了麼的面試官問我的,主要是想考查如何思考對於輸入的字符串合法。對於這個問題,面試官引導我先寫幾個測試用例,找出合法字符串的特徵,我們可以考慮以下用例:
“123.670”——合法
“-123.689”——合法
“da12.3”——不合法
“12”——合法
“12.3.9”——不合法
“00.123”——不合法
我們可以從四個方面考慮:
- 能出現的字符:負號(-),數字(0-9),小數點(.)
- 出現的次數:負號(-),小數點(.)一次,大小是否越界(越界這個我不會,(⊙o⊙)…)
- 出現的位置:負號(-)必須在最前,而(.)必須在中間(最前或者最後都不行)
- 出現的組合:001,002這種(這點我理解爲,0出現的位置,如果第一個字符是0,而他後面沒有緊接着出現小數點那麼這就是一個不合法的字符串)
public static double stringToDouble(String str) throws Exception{
boolean negative = false;
double sum = 0.0d;
boolean pointAppear = false;
int count = 1;//用來記錄小數點後幾位
if(str == null || str.equals("")){
throw new Exception("重新輸入字符串");
}
for(int i=0;i<str.length();i++){
//判斷第一個字符是不是負號
if(i == 0 && (str.charAt(0)=='-'||str.charAt(0)=='+')){
if(str.charAt(i) == '-')
negative = true;
}else{
//判斷是否爲小數點
if(pointAppear == false && i !=0 && str.charAt(i) == '.'){
pointAppear = true;
}else if(str.charAt(i)>='0' && str.charAt(i)<='9'){
if(i==0 && str.charAt(i) == '0' ){
if(str.charAt(i+1) != '.')
throw new Exception("不合法字符串1");
}
if(i==1 && str.charAt(i) == '0' && (str.charAt(0)=='-'||str.charAt(0)=='+')){
if(str.charAt(i+1) != '.')
throw new Exception("不合法字符串2");
}
//整數部分
if(pointAppear == false){
sum = sum*10 +(str.charAt(i)-'0');
if(sum > Double.MAX_VALUE) {
throw new Exception("越界");
}
}else{
sum = sum + Math.pow(0.1,count)*(str.charAt(i)-'0');
count++;
}
}else{
throw new Exception("不合法字符串3");
}
}
}
return negative == true ? sum*(-1):sum;
}