判断一个字符串是否是数值
生活随笔
收集整理的這篇文章主要介紹了
判断一个字符串是否是数值
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
劍指 Offer 20. 表示數(shù)值的字符串
難度中等193收藏分享切換為英文接收動態(tài)反饋
請實現(xiàn)一個函數(shù)用來判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。
數(shù)值(按順序)可以分成以下幾個部分:
小數(shù)(按順序)可以分成以下幾個部分:
整數(shù)(按順序)可以分成以下幾個部分:
部分數(shù)值列舉如下:
- ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非數(shù)值列舉如下:
- ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
?
示例 1:
輸入:s = "0" 輸出:true示例 2:
輸入:s = "e" 輸出:false示例 3:
輸入:s = "." 輸出:false示例 4:
輸入:s = "????.1??" 輸出:true提示:
- 1 <= s.length <= 20
- s?僅含英文字母(大寫和小寫),數(shù)字(0-9),加號?'+'?,減號?'-'?,空格?' '?或者點?'.'?。
C++代碼
具體原理見程序
class Solution {//符號 出現(xiàn)位置限制 出現(xiàn)次數(shù)//小數(shù)點. 不能出現(xiàn)在e或E后面 不能出現(xiàn)在末尾,必須緊跟著數(shù)字 只能出現(xiàn)一次 //+ - 只能出現(xiàn)在開頭或者e或E的后面 最多兩次//e E 前面必須是數(shù)字 后面必須是= - 或數(shù)字 只能出現(xiàn)一次 public: //去掉字符串首尾空格void trim(string& str){str.erase(0, str.find_first_not_of(" \t")); // 去掉頭部空格str.erase(str.find_last_not_of(" \t") + 1); // 去掉尾部空格}bool isNumber(string s) {if(s.empty()) return false;//去掉前面的空格trim(s);bool numFlag = false;bool dotFlag = false;bool eFlag = false;for(int i = 0; i < s.size(); i++){//如果當(dāng)前位置是數(shù)字 則numFlag變?yōu)閠rueif(isdigit(s[i])) numFlag = true;//如果當(dāng)前位置是小數(shù)點 則需要前面沒出現(xiàn)過小數(shù)點 并且沒有出現(xiàn)過e|Eelse if(s[i] == '.' && !dotFlag && !eFlag){if(i != (s.size() - 1) && !numFlag && (s[i+1] == 'e' || s[i+1] == 'E')) return false;//".e3"dotFlag = true;}//如果當(dāng)前位置出現(xiàn)的是e|E 則需要前面沒出現(xiàn)過e|E 并且不能出現(xiàn)在首位else if(i != 0 && (s[i] == 'e' || s[i] == 'E') && !eFlag && numFlag){//s[i] == 'e' || s[i] == 'E' 需要加括號eFlag = true;numFlag = false;//為了避免123e這種請求,出現(xiàn)e之后就標(biāo)志為false}//如果出現(xiàn)的是+- 則只能出現(xiàn)在開頭 或者緊接著e|Eelse if((s[i] == '+' || s[i] == '-') && (i == 0 || s[i - 1] == 'e' || s[i - 1] == 'E')){//這里不需要執(zhí)行 只需要滿足這個情況時 不false就行}//其他字符或其他情況都非法elsereturn false; }//循環(huán)遍歷之后沒有false 則只要字符串中存在數(shù)字 則正確 故返回numFlagreturn numFlag;} };?
總結(jié)
以上是生活随笔為你收集整理的判断一个字符串是否是数值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原有ui项目调用qml_从0开始写前端U
- 下一篇: 计算若干数据的汉明距离总和