这是《剑指Offer》的第 20 题:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

书中的这道题目和 Leetcode 上的有所不同,我们以 Leetcode 上的为例进行说明。题目见这里

我们和之前一样,先记录一下自己的解法,然后我们再来说说书中的解法。

我自己在看到这道题后,想出了一个方法,把这个大问题分为四个小问题,分别为:

  • 去除输入字符串前后的空格
  • 判断该字符串是否为整数
  • 判断该字符串是否为符点数
  • 判断该字符串是否为科学计数法表示的数(是否含 E 或 e)

然后我们针对这四个问题写四个函数,组合在一起,就可以把问题解决。

这是我的提交记录。

而在书中,作者虽然也是把问题分解,但是是从另外一个角度进行分解的,和我的不同。书中把一个数用 A[.(B)][E|eC] 来表示,A 代表一个数的整数 部分;B 代表一个数的小数部分;C 代表一个数的指数部分。其中,A 和 C 是带符号整数,而 B 则是无符号整数。因此,我们只需要三个函数就可以把 问题解决:

  • 去除输入字符串前后的空格
  • 判断字符串是否为带符号整数
  • 判断字符串是否为无符号整数

假设输入字符串为 s,算法思路如下:

  • 去除输入字符串前后的空格
  • 判断字符串是否为带符号整数,并快进 s,结果为 res
  • 如果 s == '.',那么判断 s 是否为无符号整数,得到的结果应该与 res 进行运算,因为一个数的整数部分或小数部分有可能为空
  • 如果 s == 'E' || s == 'e',那么判断 s 是否为带符号整数,得到的结果应该与 res 进行运算,因为字符串一旦有指数部分,那么指数部分不能为空或非法值
  • 如果 s 此时不是 '\0',那么说明此时 s 中含有非法字符,所以 res = false
  • 返回结果 res

这是我的提交记录。

心得:

  • 这道题,我想说的是,我的分析问题的能力已经比之前总结 19 题《正则表达式的匹配》时好了一些了,至少我 这道题提出了自己的解决方法。但是相比与作者的解法,还是显得不够成熟
  • 在做这道题时,我一开始也想放弃,因为感觉可能存在的情况实在是太多了。但是,经过仔细的思考,用了 30 分钟 左右就已经将第一版的代码编写完成了。我想说的是,不要着急的否定自己,不要惰于思考。在实际的生产环境中,是 没有答案给你的,你能做的唯一一件事就是努力的分析问题,并提出解决方案。做题也是对生产环境的一种演练,如果 这时你总是一想不出来就看答案,那么到了生产环境中没有答案时,你岂不是只能干瞪眼了?

以上。