题目:

如果把所有int型值打印出来的形式看成是一个范围。给定一个字符串str,如果str属于这个范围则把str转换成相对应的整数并返回;否则打印”can not convert!”,并返回0;
例子:
str: “123″
返回123

str: “023″
“can not convert!”
返回0
因为没有int型值打印出来是”023″,23打印出来应该是”23″这个形式。

str: “999999999999999999999999″
can not convert!
返回0
因为溢出了

str: “0″
返回0

要求:
1,不能使用完成类似功能的现成方法,如Integer.valueOf()等
2,不能使用long类型的变量

 

解答:

难度:尉
首先解决的问题是如果不考虑溢出的限制,怎么判断字符串str属于规定的范围,具体请参看如下代码中的isValid方法。
isValid的方法其实解决了判断str是否符合我们平时正常书写一个整数的形式,接下来要考虑的是在转化的过程中,如何判断str代表的整数是否溢出的问题。
首先我们选择依次累计每一个字符值的方式,例如”123″,则遍历每一个字符之后依次得到的值为:1;1*10+2=12;12*10+3=123;
我们把每一次累加一个字符值之前的结果,记为res,如遍历到’1′时,res为0;到’2′时,res为10,到’3′时,res为12;结束后,res为123
如果可以表示的整数最大值记为max;最小值记为min。那么在遍历每一个字符时,在累加这个字符之前,只要判断res和当前字符的状况就可以知道这一次累加会不会产生溢出。

如果我们在每一次累加之前都判断了本次累加不会溢出,那么最后的res就是我们想要的结果。
以下代码为每一次遍历字符时都发生的判断:

这样我们就完成了转化需要考虑的所有细节,以下是整体的代码实现: 

 

 

欢迎留言