有效數(shù)字
驗(yàn)證給定的字符串是否可以解釋為十進(jìn)制數(shù)字。
例如:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
" -90e3 " => true
" 1e" => false
"e3" => false
" 6e-1" => true
" 99e2.5 " => false
"53.5e93" => true
" --6 " => false
"-+3" => false
"95a54e53" => false
說明: 我們有意將問題陳述地比較模糊。在實(shí)現(xiàn)代碼之前,你應(yīng)當(dāng)事先思考所有可能的情況。這里給出一份可能存在于有效十進(jìn)制數(shù)字中的字符列表:
數(shù)字 0-9
指數(shù) - "e"
正/負(fù)號(hào) - "+"/"-"
小數(shù)點(diǎn) - "."
當(dāng)然,在輸入中,這些字符的上下文也很重要。
題目分析
這題我感覺是一種代碼實(shí)現(xiàn)問題,考查考慮問題是否全面?
沒有什么特別的算法思想,想清楚判定數(shù)字的流程,然后一路判斷下來即可。但是要實(shí)現(xiàn)你原計(jì)劃的流程,還是要好好打理一下自己的代碼。字符特征 :
2.1 可能包含”0~9“,”e“,”.“,“+”,“-”,” “。
2.2 ”e” 允許出現(xiàn)的次數(shù)?還要考慮“e”后是否允許出現(xiàn)”." , ”+“,”-“?是否允許作為開頭結(jié)尾?前面是否一定要有數(shù)字?
2.3 “." 允許出現(xiàn)的次數(shù)? ”." 后是否允許出現(xiàn) “e" , "+ " ,"- "?是否允許作為開頭結(jié)尾 ?前面是否一定要有數(shù)字?
2.4 ”+“ ,”-“,最多出現(xiàn)兩次,一次在冪,一次在指數(shù),且一定位于其他符號(hào)之前,且不能作為結(jié)尾
2.5 ”0~9“ ,”0“是否允許在冪 或者 指數(shù) 或者 小數(shù)部分 的首部,是否允許”0“結(jié)尾的小數(shù)部分。
2.6 ” “,只能作為開頭結(jié)尾。
2.7 整個(gè)數(shù),必須要有數(shù)字出現(xiàn)。判斷流程
3.1 數(shù)前空格清除
3.2 首位判斷+ - 號(hào),然后進(jìn)入冪部分/整數(shù)部分
3.3 正常判斷數(shù)字,遇到 ”." 進(jìn)入小數(shù)部分,“e” 進(jìn)入指數(shù)部分,其余false。
3.4.1 小數(shù)部分,標(biāo)記小數(shù)點(diǎn)已經(jīng)用過,不能再出現(xiàn),其余照常。
3.4.2 指數(shù)部分,檢查e前是否有數(shù)字,”+“ ”-“可以再用,重置”+-“的標(biāo)志位,小數(shù)點(diǎn)不能用了,小數(shù)點(diǎn)標(biāo)志位置false,當(dāng)然e也不能再用了。繼續(xù)照常檢查數(shù)字。
3.5 檢查到” “,” “只能作為末尾出現(xiàn),因此直接跳出主體循環(huán),進(jìn)入尾部判斷環(huán)節(jié)。
3.6 數(shù)的結(jié)尾檢查,不能是”e", "+ " "-" ,但可以是“ . ”。
3.7尾部清洗,一路檢查是否是“ ”,遇到個(gè)不是的則false。
3.8 檢查全部通過,但它也要有數(shù)字才可能是數(shù)!return HasNum;
題解代碼
class Solution {
public:
bool isNumber(string s)
{ //0開頭結(jié)尾 true
//多個(gè)e false
//e左右兩邊要有數(shù)
//指數(shù)不能為小數(shù)
int i=0;
bool UsedSign=false;
bool UsedCom=false;
bool UsedExp=false;
bool HasNum=false;
//首部空格清除
while(i<s.size())
{
if(s[i]!=' ')
break;
i++;
}
//首位判斷符號(hào)位
if(i<s.size() && (s[i]=='+' || s[i]=='-') )//符號(hào)
{
UsedSign=true;
i++;
}
//主體判斷
for(;i<s.size();i++)
{
if(s[i]>='0' && s[i]<='9')
{
HasNum=true;
continue;
}
else if(s[i]=='+' || s[i]=='-')//主要用來判斷指數(shù)的符號(hào)
{
if(UsedSign==false && s[i-1]=='e')
{
UsedSign=true;
continue;
}
else
return false;
}
else if(s[i]=='.')//小數(shù)點(diǎn)
{
if(UsedCom==false)
{
UsedCom=true;
continue;
}
else
return false;
}
else if(s[i]=='e')//指數(shù)符號(hào)
{
if(UsedExp==false && HasNum==true) //e前需有數(shù)字
{
UsedExp=true;
UsedSign=false;//重置符號(hào)狀態(tài)位,指數(shù)也可以帶符號(hào)
UsedCom=true;//指數(shù)不能是小數(shù)
continue;
}
else
return false;
}
else if(s[i]==' ') //尾部空格
break;
else
return false;
}
if(s[i-1]=='e' ||s[i-1]=='+' || s[i-1]=='-')//e + -結(jié)尾 不行
return false;
while(i<s.size())//尾部空格清除
{
if(s[i]!=' ')
return false;
i++;
}
return HasNum;
}
};