剑指 offer —— 将字符串转换成整数
剑指 offer —— 将字符串转换成整数
这道题是微软面试题目之一,看似简单,却要求面试者在简单的题目中展现完整的解决思路,除了完成基本功能外,还要考虑边界值,错误处理等各个方面。
错误示范
// 简单的实现方法
int StrToInt(char* string)
{
int number = 0;
while(*string != 0)
{
number =number * 10 + *string - '0';
++string;
}
return number;
}
以上代码中只能解决基本功能,未考虑输入字符串中有非数字和正负号,以及最大正整数和最小负整数以及溢出的问题,除此之外,也没有做异常处理,代码鲁棒性不强。
这道题目正确的做法,要考虑到以下各种情况:
正确完整答题思路
- 异常输入和0输入的区分 ,设置一个全局变量;
- 正负号的处理
- 溢出处理
int StringToInt (String string)
{
// 初始化保存的结果
int result = 0;
// 标记正负号,默认为正
int symbol = 1;
// 判断输入是否合法 默认合法
boolean isValid = true;
// 对传入的字符串首先转换成char数组
char[] array =string.toCharArray();
if (array == null || array.length<=0){
return 0;
}
// 这里进行正负值处理
if (array[0] == '-'){
symbol = -1;
}
for(int i =(array[0] == '-' || array[0] == '+') ? 1:0;i<array.length;i++){
if(!(array[i]>='0' && array[i]<='9')){
// 不在数值范围内
isValid = false;
return 0;
}
// 对得到的结果进行处理
result = result * 10 + array[i] - '0';
// 判断溢出
if ((symbol == 1 && result > Integer.MAX_VALUE) || (symbol == -1
&& result < Integer.MIN_VALUE)){
return 0;
}
}
return result * symbol;
}