atoi是c/c++的库函数,用于将字符串类型转为int类型,这是一个经常出现在面试中的问题,我觉得这道题可简单也可复杂,关键看面试官的发挥。
先看一个最简单的实现,这个实现应该要快速能够写出来,因为这是最基本的实现,这通常也不会是面试官期望的最终答案。
很容易看出来,上面的实现有很多问题,首先是没有处理异常情况,比如说字符串是null,或者包含非数字字符,不支持负数等等,下面再写一个能够支持负数,并且有异常处理的逻辑的实现。
现在看起来好多了,但是还有一个问题没有处理,那就是溢出,整型是有范围的,如果传入的字符串转为数字会超过整型的范围,我们应该抛出异常,而不是返回错误结果。这里有两个小技巧,一是我们需要在溢出的前一次进位的时候判断是否可能溢出,二是为了统一处理正数和负数的情况,在计算过程中我们会统一使用负数,因为使用-Integer.MIN_VALUE作为判断的时候会溢出,如果是正负数分开处理就不用考虑这个问题了。