题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述:
输入一个字符串,包括数字字母符号,可以为空
返回值描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1:
输入:"+2147483647"
输出:2147483647
示例2:
输入:"1a33"
输出:0
题目链接
解题思路
该题目主要有三个方面要注意:
一是判断第一个字符是否为符号“+” 或 “-”;
二是判断字符串中间是否有非法字符,即非数字(字母);
三是判断是否为空字符串;
所以,上来应该先判断是否为空,以及字符串长度是否小于1;
然后将字符串转为字符数组,遍历字符数组,判断是否有非法字符,即判断是否合法;
如果不合法则返回0;如果合法则继续判断首字符是否是符号,如果是正号(“+”)则将标志位flag置为1,如果是负号(“-”)将标志位置为-1;
然后遍历数组, res = 10*res+chs[i]-'0'; 这里注意,从数组里获得的是字符,并不是数字,所以要减去 '0' ,这样得到的才是真正的数字(0-9)。
最后返回标志位flag*res乘积。
----
以上的思路是一个传统的思路,其实,还可以进行优化。
比如,可以把判断是否合法放在计算res结果的这个循环里面,这样就将两次遍历数组减少为只需遍历一次就行。
还可以标志位判断也放在循环里。
代码如下:
public class Solution { public int StrToInt(String str) { if(str.isEmpty()||str.length()<1)//特别注意这里的判断 return 0; char[] chs = str.toCharArray(); // if(!isLegal(chs)){ // return 0; // } int res = 0; /* int flag = 1; if(chs[0]=='-') flag = -1; else if(chs[0]=='+') flag = 1; else res = chs[0]-'0'; */ for(int i = 0;i<chs.length; i++){ if(chs[i]=='-' || chs[i]=='+') continue; if(chs[i]<'0' || chs[i]>'9') return 0; res = 10*res+chs[i]-'0'; } return chs[0]=='-'?-res:res; }
//该函数在这里没有用到,只是为了对比第一种思路; public boolean isLegal(char[] chs){ for(int i = 0; i<chs.length; i++){ if(!(chs[i]>='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z')){ return false; } } return true; } }
Over...