▶ LeetCode 上最费神的题目之一,检查一个字符串是否是一个数字,需要考虑前后空格,数字符,小数点,指数符(e),其他杂质字符等情况。
● 代码,8 ms,直白的逐位遍历和分析。
1 class Solution 2 { 3 public: 4 bool isNumber(string s) 5 { 6 int i, n_nm, n_pt; 7 for (i = 0; s[i] == ' '; i++);//跳过前导空格 8 9 if (s[i] == '+' || s[i] == '-') // 符号位 10 i++; 11 for (n_nm = 0, n_pt = 0; (s[i] <= '9' && s[i] >= '0') || s[i] == '.'; i++) 12 s[i] == '.' ? n_pt++ : n_nm++; 13 if (n_pt > 1 || n_nm < 1) // 多于一个点或少于一个数字 14 return false; 15 16 if (s[i] == 'e')// 检查指数部分 17 { 18 i++; 19 if (s[i] == '+' || s[i] == '-') 20 i++; 21 for (n_nm = 0; s[i] >= '0' && s[i] <= '9'; i++, n_nm++); 22 if (n_nm < 1) 23 return false; 24 } 25 26 for (; s[i] == ' '; i++);// 跳过尾部空白 27 return s[i] == 0;// 确保尾部是'\0'而没有其他东西 28 } 29 };
● 代码,10 ms,比较系统的分情况讨论,思想值得精读和学习
1 class Solution 2 { 3 public: 4 bool isNumber(string s) 5 { 6 s.erase(0, s.find_first_not_of(" "));// 取出前后的空白 7 s.erase(s.find_last_not_of(" ") + 1); 8 int pos = s.find_first_of("e");// 寻找第一个 'e' 得我位置 9 if (pos == -1) // 没有 'e',当做整数处理 10 return isValidfloat(s); 11 else // 有 'e',将原数字砍成两半,前半段当浮点数处理,后半段当整数处理 12 return isValidfloat(s.substr(0, pos)) && isValidInteger(s.substr(pos + 1)); 13 } 14 bool isValidfloat(string s) 15 { 16 int i, n_dot; 17 if (!s.empty() && (s[0] == '-' || s[0] == '+')) 18 s.erase(s.begin()); 19 for (n_dot = i = 0; i < s.size(); i++) 20 { 21 if (s[i] == '.') 22 n_dot++; 23 else if (!isdigit(s[i])) 24 return false; 25 } 26 return n_dot <= 1 && s.size() > n_dot; 27 } 28 bool isValidInteger(string s) 29 { 30 int i; 31 if (!s.empty() && (s[0] == '-' || s[0] == '+')) 32 s.erase(s.begin()); 33 for (i = 0; i<s.size(); i++) 34 { 35 if (!isdigit(s[i])) 36 return false; 37 } 38 return s.size(); 39 } 40 };