原题链接:https://leetcode-cn.com/problems/string-to-integer-atoi/description/
解决方案:
public int myAtoi(String str) { if(str.isEmpty()) return 0; int flag =1,i=0; long result = 0; //判断空字符的个数,并且确定空字符结束的位置 while(i < str.length() && str.charAt(i) == ' ') i++; //如果统计的空字符个数与字符串长度相同,则判断为这个空字符,不能转换 if(i == str.length()) return 0; //由于上面是i++,所以此时i为空字符之后的第一个非空字符的索引值,此位置判断为 //flag为正还是负的位置,并分别赋值 if (str.charAt(i) == '+' || str.charAt(i) == '-'){ flag = str.charAt(i)=='+'? 1 : -1; i++; } //过去这符号位之后,应该是判断是否是数字字符,如果不是则不会执行下面的for循环, //并且下一位不是数字则其不会再进行while循环 while(i < str.length() && str.charAt(i) >= '0'&& str.charAt(i)<='9'){ result = 10 * result + (str.charAt(i++) -'0'); //判断是否发生了溢出,超出了所给的位置 if(result > Integer.MAX_VALUE){ return flag==1?Integer.MAX_VALUE:Integer.MIN_VALUE; } } return Integer.parseInt(String.valueOf(result * flag)); }
算法的主要核心还是在于对于字符串的位置移动的考虑,当然也可以通过StringBuffer来实现:
public int myAtoi(String str) { if(str.isEmpty()) return 0; int flag =1,start = 0; long result = 0; char[] ch = str.trim().toCharArray(); StringBuffer buf = new StringBuffer(); if(ch.length == 0){ return 0; } if(ch[0] =='+' || ch[0] =='-'){ flag = ch[0] =='+' ? 1 : -1; start = 1; } for(int i = start; i<ch.length; i++){ if(ch[i] >= '0' && ch[i] <= '9'){ //result = result * 10 + ch[i] - '0'; buf.append(ch[i]); }else break; result = Long.parseLong(buf.toString()); if(result > Integer.MAX_VALUE){ return flag==1?Integer.MAX_VALUE:Integer.MIN_VALUE; } } if(buf.length() == 0){ buf.append(0); result = Long.parseLong(buf.toString()); } return Integer.parseInt(String.valueOf(result * flag)); }
这个解决方法则是将符合的数字利用一个buf存储,然后转换为String在进行整数转换,所以,当首字符为字母是,其长度为0,所以需要增加一个判断是否为零,输出为0的分支,而且判断溢出则最好是在for循环里面,否则数字太大了没有任何一种数据可以容纳时,则就会出现报错,所以可以在循环的过程中发现溢出了就判断返回溢出对应带的输出情况就好。