当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。

解法

解法一

利用正则表达式匹配即可。

  1. [] 字符集合
  2. () 分组
  3. ? 重复 0 ~ 1
  4. + 重复 1 ~ n
  5. * 重复 0 ~ n
  6. . 任意字符
  7. \\. 转义后的 .
  8. \\d 数字
  1. /**
  2. * @author bingo
  3. * @since 2018/11/21
  4. */
  5. public class Solution {
  6. /**
  7. * 判断是否是数字
  8. * @param str
  9. * @return
  10. */
  11. public boolean isNumeric(char[] str) {
  12. return str != null
  13. && str.length != 0
  14. && new String(str).matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?");
  15. }
  16. }

解法二【剑指offer解法】

表示数值的字符串遵循模式A[.[B]][e|EC]或者.B[e|EC],其中A为数值的整数部分,B紧跟小数点为数值的小数部分,C紧跟着e或者E为数值的指数部分。上述A和C都有可能以 + 或者 - 开头的0~9的数位串,B也是0~9的数位串,但前面不能有正负号。

  1. /**
  2. * @author mcrwayfun
  3. * @version v1.0
  4. * @date Created in 2018/12/29
  5. * @description
  6. */
  7. public class Solution {
  8. private int index = 0;
  9. /**
  10. * 判断是否是数值
  11. * @param str
  12. * @return
  13. */
  14. public boolean isNumeric(char[] str) {
  15. if (str == null || str.length < 1) {
  16. return false;
  17. }
  18. // 判断是否存在整数
  19. boolean flag = scanInteger(str);
  20. // 小数部分
  21. if (index < str.length && str[index] == '.') {
  22. index++;
  23. // 小数部分可以有整数或者没有整数
  24. // 所以使用 ||
  25. flag = scanUnsignedInteger(str) || flag;
  26. }
  27. if (index < str.length && (str[index] == 'e' || str[index] == 'E')) {
  28. index++;
  29. // e或E前面必须有数字
  30. // e或者E后面必须有整数
  31. // 所以使用 &&
  32. flag = scanInteger(str) && flag;
  33. }
  34. return flag && index == str.length;
  35. }
  36. private boolean scanInteger(char[] str) {
  37. // 去除符号
  38. while (index < str.length && (str[index] == '+' || str[index] == '-')) {
  39. index++;
  40. }
  41. return scanUnsignedInteger(str);
  42. }
  43. private boolean scanUnsignedInteger(char[] str) {
  44. int start = index;
  45. while (index < str.length && str[index] >= '0' && str[index] <= '9') {
  46. index++;
  47. }
  48. // 判断是否存在整数
  49. return index > start;
  50. }
  51. }

测试用例

  1. 功能测试(正数或者负数;包含或者不包含整数部分的数值;包含或者不包含效数部分的值;包含或者不包含指数部分的值;各种不能表达有效数值的字符串);
  2. 特殊输入测试(输入字符串和模式字符串是空指针、空字符串)。

该分类下的相关小册推荐: