题目

Validate if a given string can be interpreted as a decimal number.

Some examples:
"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

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one. However, here is a list of characters that can be in a valid decimal number:

  • Numbers 0-9
  • Exponent - “e”
  • Positive/negative sign - “+”/“-“
  • Decimal point - “.”

Of course, the context of these characters also matters in the input.

Update (2015-02-10):
The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.


题意

给定一个字符串,判断它能不能正确表示一个数。满足条件的字符串中只可能包含以下字符:’0’-‘9’、科学计数’e’、正负符号’+’/‘-‘、小数点’.’。

思路

坑点在于需要判断的情况比较多。我的方法是针对字符串中的每一个字符,只判断它与前后两个字符形成的组合是否有效。具体有效组合参考注释。(d代表数字)


代码实现

Java

  1. class Solution {
  2. public boolean isNumber(String s) {
  3. boolean isExponentExist = false; // 记录'e'是否已出现
  4. boolean isPointExist = false; // 记录'.'是否已出现
  5. s = s.trim();
  6. if (s.length() == 0) {
  7. return false;
  8. }
  9. for (int i = 0; i < s.length(); i++) {
  10. char c = s.charAt(i);
  11. if (!isDigit(c) && c != '+' && c != '-' && c != 'e' && c != '.') {
  12. return false;
  13. }
  14. if ((c == '+' || c == '-') && !isPlusOrMinusValid(s, i)) {
  15. return false;
  16. }
  17. if (c == 'e') {
  18. if (isExponentExist || !isExponentValid(s, i)) {
  19. return false;
  20. }
  21. isExponentExist = true;
  22. }
  23. if (c == '.') {
  24. if (isPointExist || isExponentExist || !isPointValid(s, i)) {
  25. return false;
  26. }
  27. isPointExist = true;
  28. }
  29. }
  30. return true;
  31. }
  32. private boolean isDigit(char c) {
  33. return c >= '0' && c <= '9';
  34. }
  35. // '+'/'-'的有效组合: [+-][d.] e[+-]d
  36. private boolean isPlusOrMinusValid(String s, int i) {
  37. if (i == 0 && 1 < s.length() && (isDigit(s.charAt(1)) || s.charAt(1) == '.')) {
  38. return true;
  39. }
  40. if (i - 1 >= 0 && s.charAt(i - 1) == 'e' && i + 1 < s.length() && isDigit(s.charAt(i + 1))) {
  41. return true;
  42. }
  43. return false;
  44. }
  45. // 'E'的有效组合: [d.]e[d+-]
  46. private boolean isExponentValid(String s, int i) {
  47. if (i - 1 >= 0) {
  48. char left = s.charAt(i - 1);
  49. if (i + 1 < s.length()) {
  50. char right = s.charAt(i + 1);
  51. if ((isDigit(left) || left == '.') && (isDigit(right) || right == '+' || right == '-')) {
  52. return true;
  53. }
  54. }
  55. }
  56. return false;
  57. }
  58. // '.'的有效组合: d.d d.e [+-].d d. .d
  59. private boolean isPointValid(String s, int i) {
  60. if (i - 1 >= 0) {
  61. char left = s.charAt(i - 1);
  62. if (i + 1 < s.length()) {
  63. char right = s.charAt(i + 1);
  64. if (isDigit(left) && (right == 'e' || isDigit(right))) {
  65. return true;
  66. }
  67. if ((left == '+' || left == '-') && isDigit(right)) {
  68. return true;
  69. }
  70. } else {
  71. if (isDigit(left)) {
  72. return true;
  73. }
  74. }
  75. } else {
  76. if (i + 1 < s.length()) {
  77. char right = s.charAt(i + 1);
  78. if (isDigit(right)) {
  79. return true;
  80. }
  81. }
  82. }
  83. return false;
  84. }
  85. }

JavaScript

  1. /**
  2. * @param {string} s
  3. * @return {boolean}
  4. */
  5. var isNumber = function(s) {
  6. return !s.match(/.?Infinity/) && !Number.isNaN(Number(s))
  7. };