【leetcode】8. String to Integer (atoi)
题目描述:
Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
解题思路:
这道题简直让人抓狂!试了许多次都没有通过,原因是要考虑多种情况。主要考虑的因数有:
- 要考虑前几个或全部字符都是空白字符的情况;
- 要考虑第一个字符是+,-,还是0-9的字母,或是其他字符;
- 要考虑有没有值得溢出,尤其是最小值溢出;
- 若中间有非数字字符,要返回之前的数字,如“123a34”要返回123;
- 若以若干个0开始,则0要忽略,如“-0000234”要返回-234
找出这几种情况之后,就代码就不难写了。总之这道题AC率很低的原因并不是逻辑有多难,而是很难考虑到全部的情况。
具体代码:
public class Solution { public static int myAtoi(String str) { //取出两边空白字符 str=str.trim(); if(str==null||str.length()==0) return 0; if(str.length()==1){ if(str.charAt(0)>='0' && str.charAt(0)<='9') return Integer.valueOf(str); else return 0; } //第一个字符是'+ if(str.charAt(0)=='+'){ String s = str.substring(1); if(isValid(s)){ s=fun(s); if(s==null) return 0; MyCompatator m = new MyCompatator(); if(m.compare(s, ""+Integer.MAX_VALUE)>=0){ return Integer.MAX_VALUE; } else{ return Integer.valueOf(s); } } else{ s=fun1(s); if(s==null) return 0; s=fun(s); if(s==null) return 0; MyCompatator m = new MyCompatator(); if(m.compare(s, ""+Integer.MAX_VALUE)>=0){ return Integer.MAX_VALUE; } else{ return Integer.valueOf(s); } } } //第一个字符是'- else if(str.charAt(0)=='-'){ String s = str.substring(1); if(isValid(s)){ s=fun(s); if(s==null) return 0; MyCompatator m = new MyCompatator(); StringBuilder sb =new StringBuilder(""+Integer.MIN_VALUE); sb.deleteCharAt(0); String ss=sb.toString(); if(m.compare(s, ss)>=0) return Integer.MIN_VALUE; else{ return Integer.valueOf(str); } } else{ s=fun1(s); if(s==null) return 0; s=fun(s); if(s==null) return 0; MyCompatator m = new MyCompatator(); StringBuilder sb =new StringBuilder(""+Integer.MIN_VALUE); sb.deleteCharAt(0); String ss=sb.toString(); if(m.compare(s, ss)>=0) return Integer.MIN_VALUE; else{ return Integer.valueOf("-"+s); } } } //第一个字符是数字 else if(str.charAt(0)>='0' && str.charAt(0)<='9'){ if(isValid(str)){ str=fun(str); if(str==null) return 0; MyCompatator m = new MyCompatator(); if(m.compare(str, ""+Integer.MAX_VALUE)>=0){ return Integer.MAX_VALUE; } else{ return Integer.valueOf(str); } } else{ str=fun1(str); if(str==null) return 0; str=fun(str); if(str==null) return 0; MyCompatator m = new MyCompatator(); if(m.compare(str, ""+Integer.MAX_VALUE)>=0){ return Integer.MAX_VALUE; } else{ return Integer.valueOf(str); } } } //第一个字符是其他数字则出错 else{ return 0; } } //判断字符串是否是由数字组成的 public static boolean isValid(String s){ //return s.matches("[1-9][0-9]*"); return s.matches("[0-9]+"); } //将数字串开始的0全部去掉 public static String fun(String s){ int index=0; boolean key=false; for(index=0;index<s.length();index++){ if(s.charAt(index)!='0'){ key=true; break; } } if(key){ return s.substring(index); } else{ return null; } } //截取第一个不是数字字符之前的数字 public static String fun1(String s){ int index=0; for(index=0;s.charAt(index)>='0'&&s.charAt(index)<='9';index++){ } if(index==0) return null; return s.substring(0,index); } } class MyCompatator implements Comparator<String>{ @Override public int compare(String s1, String s2) { if(s1.length()>s2.length()){ return 1; } else if(s1.length()<s2.length()){ return -1; } else{ for(int i=0;i<s1.length();i++){ if(s1.charAt(i) - s2.charAt(i) >0) return 1; else if(s1.charAt(i) - s2.charAt(i) <0) return -1; else ; } return 0; } } }