题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。
但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
注意:
小数可以没有整数部分,例如.123等于0.123;
小数点后面可以没有数字,例如233.等于233.0;
小数点前面和后面可以有数字,例如233.666;
当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;
样例:
输入: “0”
输出: true

解法:模拟

纯粹考细节的题目
自己踩坑的测试用例:

  • “.”
  • “”

时间复杂度O(n),空间复杂度O(1)

  1. class Solution {
  2. public:
  3. bool isNumber(string s) {
  4. bool e = false, num = false, dec = false, point = false, sign = false;
  5. for (int i = 0; i < s.size(); i++) {
  6. if (s[i] == 'e' || s[i] == 'E') {
  7. e = true;
  8. if (num == false && dec == false)
  9. return false;
  10. dec = false;
  11. num = false;
  12. point = false;
  13. sign = false;
  14. }
  15. else if (s[i] >= '0' && s[i] <= '9') {
  16. if (i > 0 && s[i - 1] == '.') {
  17. num = false;
  18. dec = true;
  19. }
  20. else num = true;
  21. }
  22. else if (s[i] == '.') {
  23. if (point) return false;
  24. else point = true;
  25. }
  26. else if (s[i] == '+' || s[i] == '-') {
  27. if (sign) return false;
  28. else if (i == 0 || s[i - 1] == 'E' || s[i - 1] == 'e')
  29. sign = true;
  30. else return false;
  31. }
  32. else return false;
  33. }
  34. if (e && num == false)
  35. return false;
  36. if (num == false && dec == false)
  37. return false;
  38. return true;
  39. }
  40. };