請實現乙個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1e-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
測試用例:
test("test1", "100", true);
test("test2", "123.45e+6", true);
test("test3", "+500", true);
test("test4", "5e2", true);
test("test5", "3.1416", true);
test("test6", "600.", true);
test("test7", "-.123", true);
test("test8", "-1e-16", true);
test("test9", "1.79769313486232e+308", true);
printf("\n\n");
test("test10", "12e", false);
test("test11", "1a3.14", false);
test("test12", "1+23", false);
test("test13", "1.2.3", false);
test("test14", "+-5", false);
test("test15", "12e+5.4", false);
test("test16", ".", false);
test("test17", ".e1", false);
test("test18", "e1", false);
test("test19", "+.", false);
test("test20", "", false);
test("test21", nullptr, false);
思路:
1.形如a[.[b]][e|ec]或.[b][e|ec]的都來表示數值,其中ac為有符號整型,b為無符號整型
2.小數點前後,只要有乙個整型即可,且小數點後的整型是無符號整型。
3.指數前後必須要都有有符號整型。
4.字串裡不能有除了0-9的其它字元。
第一遍
// 整數的格式可以用[+|-]b表示, 其中b為無符號整數
bool scaninteger(const char** str)
bool scanunsignedinteger(const char** str)
// 數字的格式可以用a[.[b]][e|ec]或者.b[e|ec]表示,其中a和c都是
// 整數(可以有正負號,也可以沒有),而b是乙個無符號整數
bool isnumeric(const char* str)
//4.如果遇到指數e|e ,用&&,因為指數前後必須都要是數字, e2,1e是錯的
if (*str == 'e' || *str == 'e')
//5.返回是否為數值numeric,且已經掃瞄到了'\0'
return numeric&&*str=='\0';
}
改寫成以下**就不會報錯了int *p;
int a;
p=&(a+2);
int *p;
int a,b;
b=a+2;
p=&b;
問題分析:
分析一下為什麼第一種寫法就是錯的, 究其原因就是取位址操作符&必須作用於乙個左值,而(a+2)明顯是乙個表示式,不是乙個合法的左值,當然要報錯了。
左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值既能夠出現在等號左邊也能出現在等號右邊,右值則是只能出現在等號右邊。右值就是乙個臨時變數(沒有在程式中申明),只有臨時的位址空間,左值是在程式中具體定義了的,有其位址空間。換句話說,使用取位址符&對某個值取位址,左值能夠得到位址,而右值不能得到位址!
//5.返回是否為數值numeric,且已經掃瞄到了'\0'第二遍return numeric&&*str=='\0';
class solution
bool scanint(const char** str)
bool isnumeric(const char* string)
//4.如果遇到指數,指數的前後都應該有數字,所以用&&
if(*string=='e'||*string=='e')
//5.返回numeric,且string掃瞄到了結束符
return numeric&&*string=='\0';
}};
網友的
class solution else if (str[i] == '+' || str[i] == '-') else if (str[i] == '.') else if (str[i] < '0' || str[i] > '9') // 不合法字元
return false;
}return true;
}};
編譯原理中自動機(你是魔鬼嗎?
class solution else return false;
}else if(string[i]=='\0') return true;
else return false;
}else if(string[++i]=='\0') return true;
else return false;
}else if(string[i]=='e'||string[i]=='e')else return false;
}else if(string[i]=='\0') return true;
else return false;
}else return false;
}bool isnum(char ch)
};
正規表示式(魔鬼
//正規表示式解法
public class solution }/*
以下對正則進行解釋:
[\\+\\-]? -> 正或負符號出現與否
\\d* -> 整數部分是否出現,如-.34 或 +3.34均符合
(\\.\\d+)? -> 如果出現小數點,那麼小數點後面必須有數字;
否則一起不出現
([ee][\\+\\-]?\\d+)? -> 如果存在指數部分,那麼e或e肯定出現,+或-可以不出現,
緊接著必須跟著整數;或者整個部分都不出現*/
//參見劍指offer
public class solution
if (index < str.length && (str[index] == 'e' || str[index] == 'e'))
return flag && index == str.length;
}private boolean scaninteger(char str)
private boolean scanunsignedinteger(char str)
}
20題 表示數值的字串
請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 1e 16 0123 都表示數值,但 12e 1a3.14 1.2.3 5 及 12e 5.4 都不是。本題使用有限狀態自動機。根據字元型別和合法數值的特點,先定義狀態,再畫出狀態轉移圖,最後編...
20 表示數值的字串
請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 0123 都表示數值,但 12e 1a3.14 1.2.3 5 1e 16 及 12e 5.4 都不是。def isnumber self,s str bool s s.strip met do...
ATO 20 表示數值的字串
請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 和 1e 16 都表示數值。但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是。本題能正確的ac還是有一定難度的,具體解法還是參見 劍指offer 把。class solut...