《劍指offer》:[54]表示數值的字串
題目:請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。
例如,字串“+100”,“5e2”,“-123”,“3.1416”及”-1E-16”都表示數值,但“12e”,”1a3.14”,”1.2.3”,”+-5”及“12e+5.4”都不是。
分析:這個題主要是應用數字的表示通式來解決:表示一個數字的通式為:
[sign]integral-digits[.[fractional-digits]][e|E[sign]exponential-digits]('['和']'之間的資料都是可有可無的,可省略)
表達的意思是:[符號]整型數字[小數點[小數整數]][e|E[指數的符號]指數的整數表示].按照這個步驟思路來判斷就不會錯。
看一個字串是否符合上述模式時,首先看第一個字元是不是正負號。如果是,在字串上移動一個字元,繼續掃描剩餘的字串中0到9的數位。如果是一個小數,則可能遇到小數點。另外如果是科學計數法,則在小數點的後面可能遇到e|E。
具體實現程式碼如下:
例如,字串“+100”,“5e2”,“-123”,“3.1416”及”-1E-16”都表示數值,但“12e”,”1a3.14”,”1.2.3”,”+-5”及“12e+5.4”都不是。
分析:這個題主要是應用數字的表示通式來解決:表示一個數字的通式為:
[sign]integral-digits[.[fractional-digits]][e|E[sign]exponential-digits]('['和']'之間的資料都是可有可無的,可省略)
表達的意思是:[符號]整型數字[小數點[小數整數]][e|E[指數的符號]指數的整數表示].按照這個步驟思路來判斷就不會錯。
看一個字串是否符合上述模式時,首先看第一個字元是不是正負號。如果是,在字串上移動一個字元,繼續掃描剩餘的字串中0到9的數位。如果是一個小數,則可能遇到小數點。另外如果是科學計數法,則在小數點的後面可能遇到e|E。
具體實現程式碼如下:
#include <iostream>
using namespace std;
void ScanDigits(char **str) //判斷是否是0-9之間的數字;
{
while(**str!='\0' && **str>='0' && **str<='9')
++(*str);
}
bool IsExponential(char **str)//判斷e或E之後的表示式是否合法:符號+數字;
{
if(**str!='e' && **str!='E')
return false;
++(*str);
if(**str=='+' || **str=='-')
++(*str);
if(**str=='\0')
return false;
ScanDigits(str);
return (**str=='\0')?true:false;
}
bool IsNumber(char *str)
{
if(str==NULL)
return false;
if(*str=='+' || *str=='-') //判斷符號;
++str;
if(*str=='\0')
return false;
bool numeric=true;
ScanDigits(&str);
if(*str!='\0')
{
//如果是浮點數;
if(*str=='.')
{
str++;
ScanDigits(&str);
if(*str=='e' || *str=='E')
numeric=IsExponential(&str);
}
//如果是整型數的科學計數法;
else if(*str=='e' || *str=='E')
numeric=IsExponential(&str);
else
numeric=false;
}
return numeric && *str=='\0';
}
int main()
{
char *strr[4]={"5e2","-1E-16","12e+5.4","12e"};
for(int i=0;i<4;i++)
{
if(IsNumber(strr[i]))
cout<<strr[i]<<": YES!"<<endl;
else
cout<<strr[i]<<": NO!"<<endl;
}
system("pause");
return 0;
}
執行結果:
相關文章
- 劍指Offer 表示數值的字串字串
- 劍指Offer系列之「表示數值的字串」字串
- 【劍指offer】字串轉整數字串
- 【劍指offer】字串的排列字串
- 【劍指offer】【2】字串的空格字串
- 【劍指offer】字串的組合字串
- 【劍指offer】左旋轉字串字串
- 劍指offer面試題11 數值的整數次方面試題
- 《劍指offer》:[49]把字串轉化成整數字串
- 劍指 Offer 38. 字串的排列字串
- 【劍指offer】替換字串中的空格字串
- 【leetcode】劍指 Offer 16. 數值的整數次方LeetCode
- 劍指offer(Java版)--將字串轉換為整數Java字串
- 劍指offer——把字串轉換成整數C++字串C++
- 劍指offer-字串空格替換為“ ”字串
- 《劍指offer》:[42-1]左旋轉字串字串
- 劍指offer——正規表示式匹配C++C++
- 力扣 - 劍指 Offer 67. 把字串轉換成整數力扣字串
- 【劍指offer】旋轉陣列的最小值陣列
- [劍指offer][第四章][28]字串的排列字串
- 【劍指offer】把陣列排成最小的數陣列
- 劍指 Offer 59 - II. 佇列的最大值佇列
- 《Leetcode of December》劍指 Offer 67. 把字串轉換成整數LeetCode字串
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- LeetCode|劍指 Offer 49.醜數LeetCode
- 劍指 Offer 48. 最長不含重複字元的子字串字元字串
- 【劍指offer】刪除在另一個字串中出現的字元字串字元
- 【劍指offer】二進位制中1的個數
- 劍指Offer--陣列中重複的數字陣列
- 劍指Offer-34-把陣列排成最小的數陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 《劍指offer》:[51]陣列中的重複數字陣列
- 《劍指offer》:[64]資料流中的中位數
- 劍指offer-JavaScript版JavaScript
- 劍指Offer題解合集
- leetcode *劍指 Offer 47. 禮物的最大價值LeetCode