第20題 表示數值的字串

2022-08-23 14:21:17 字數 3758 閱讀 2433

請實現乙個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+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...