码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode题解 #8 String to Integer (atoi)

时间:2015-12-01 00:02:36      阅读:451      评论:0      收藏:0      [点我收藏+]

标签:

又是一道恶心的简单题。

一开始没想到这么多情况的,幸好LeetCode是个很人性化的oj,能让你知道你在哪个case上错了,否则一辈子都过不了。

考虑不周到只能一个个补了。

列举一下恶心的case

//" 010"
//" +004500"
//" -0012a42"
//"2147483648"
//" b11228552307"
//"18446744073709551617"
//" r11384376420"

所有要注意的情况是:

  • 字符串前置的空格需要清除;//读掉所有空格
  • 无视前导0
  • 数字前最多允许1个"+"或"-",出现多个时返回0;
  • 数字中出现不为数字的符号时即认为数字结束,比如"252ab","252-2","252 09"都判定为252;//找到第一个非数字的地方
  • 数字大于INT_MAX时,返回INT_MAX,小于INT_MIN时,返回INT_MIN。

其实没有考到什么算法,就是if else而已

 

一开始的代码(觉得有必要贴出来,让以后的自己看看-_-)

public static int myAtoi(String str) {

long temp = 0;

//空白
if(str.length()==0)
return 0;
//非数字


//单个数字
else if(str.length()==1){
//System.out.println((int)str.charAt(0)-48);

if(48<=str.charAt(0)&&str.charAt(0)<=57)
return (int)str.charAt(0)-48;
else
return 0;

}

//多个数字
else{





//读掉开头的空格
int start = 0;
for(start=0;start<str.length();start++)
if(str.charAt(start)!=‘ ‘)
break;

if(start==str.length()){
System.out.println("all blank");
return 0;
}




//除开头外判断是否全是数字
//找到非数字的地方

int end = 0;

for(end=start+1;end<str.length();end ++)
if(!(48<=str.charAt(end)&&str.charAt(end)<=57)){

System.out.println(str.charAt(start));
System.out.println("not num");
System.out.println("end-->"+end);
break;


}

if(!(48<=str.charAt(start)&&str.charAt(start)<=57)&&!(48<=str.charAt(start+1)&&str.charAt(start+1)<=57)){

System.out.println("not num");
return 0;

}


if(str.charAt(start)==‘+‘){

System.out.println(str.charAt(start));

if(end-start>=13)
return 2147483647;

if(start+1==end-1)
return ((int)str.charAt(start+1)-48);

for(int i=start+1;i<end;i++){

//System.out.println("temp--->"+temp);
//System.out.println((int)str.charAt(i)-48);

if(str.charAt(i)==‘ ‘)
continue;

temp = temp*10+((int)str.charAt(i)-48);

//System.out.println("now --->"+temp);

}

//System.out.println(temp);
System.out.println("zhengshu1");

if(temp>=2147483647)
return 2147483647;
if(temp<=-2147483648)
return 2147483647;

return (int)temp;

}

else if(str.charAt(start)==‘-‘){

if(start+1==end-1)
return -((int)str.charAt(start+1)-48);

if(end-start>=13)
return -2147483648;

for(int i=start+1;i<end;i++){

//System.out.println("temp--->"+temp);
//System.out.println((int)str.charAt(i)-48);

if(str.charAt(i)==‘ ‘)
continue;

temp = temp*10+((int)str.charAt(i)-48);

//System.out.println("now --->"+temp);

}

System.out.println(temp);

temp = -temp;

System.out.println("fushu");

if(temp>=2147483647)
return -2147483648;
if(temp<=-2147483648){

System.out.println("fushu min ");
return -2147483648;
}

return (int)temp;




}
else{

System.out.println(start-end);

if(end-start>=13)
return 2147483647;

System.out.println(str.charAt(start));
System.out.println(end);

if(!(48<=str.charAt(start)&&str.charAt(start)<=57))
return 0;

if(start==end-1)
return ((int)str.charAt(start)-48);



for(int i=start;i<end;i++){

//System.out.println("temp--->"+temp);
//System.out.println((int)str.charAt(i)-48);

if(str.charAt(i)==‘ ‘)
continue;

temp = temp*10+((int)str.charAt(i)-48);

//System.out.println("now --->"+temp);

}

System.out.println(temp);
System.out.println("zhengshu2");

if(temp>=2147483647)
return 2147483647;
if(temp<=-2147483648)
return 2147483647;

return (int)temp;



}

}


}

 

以下是综合了所有情况但是高度简洁的代码:

int myAtoi(string str) {

int length = str.size();

long long ret_64 = 0;

int op = 1; int p = 0;

while (str[p] == ‘ ‘) ++p;

if (str[p] == ‘+‘ || str[p] == ‘-‘)

{ if (str[p] == ‘-‘) op = -1; p++; }

for (int i = p; i < length; ++i)

 if (‘0‘ <= str[i] && str[i] <= ‘9‘)

  { ret_64 = ret_64 * 10 + (str[i] - ‘0‘);

    if ((op == -1 && ret_64 > 2147483648LL))

       return -2147483648;

     if ((op == 1 && ret_64 > 2147483647LL))

       return 2147483647; }

     else

      break;

 return (int)ret_64 * op; }

 

总结一下:

没有技巧可言,就是常见的判断溢出(用long),一个个构建起一个数字(temp = temp*10+((int)str.charAt(i)-48);),字符转数字用ASCII码。

 

LeetCode题解 #8 String to Integer (atoi)

标签:

原文地址:http://www.cnblogs.com/wzben/p/5008617.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!