爨爨爨好

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

▶ 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 };

 

posted on 2018-01-21 10:55  爨爨爨好  阅读(150)  评论(0编辑  收藏  举报