Leetcode 8
第一次写博客因为也已经大三了,听一个学长的建议开始刷leetcode,楼主编程实力很菜,也就借此来记录一点心路历程,顺便可以监督刷下去。
题目顺序是参考leetcode刷题指南先入门
题目
实现 atoi,将字符串转为整数。
在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
先发一段第一次写的代码
class Solution {
public int myAtoi(String str) {
char []str1=str.toCharArray();
int index=0;
long res=0L;
boolean flag=true;
int length=0;
for(int i=0;i<str1.length;i++){
if(index==i){
if(str1[i]=='+'||str1[i]=='0'){
continue;
}
if(str1[i]==' ')
{
index++;
continue;
}
if(str1[i]=='-'){
flag=false;
continue;
}
}
if(str1[i]>='0'&&str1[i]<='9'){
res=res*10+str1[i]-'0';
}
else
break;
}
if(flag==true){
if(res>Integer.MAX_VALUE)
res=Integer.MAX_VALUE;
}else{
res=-res;
if(res<Integer.MIN_VALUE){
return Integer.MIN_VALUE;
}
}
return (int)res;
}
}
一开始这个代码没有注意res=res*10+str1[i]-‘0’;中要减去‘0’;
但是这个代码在处理溢出的时候还是会出错
百度了一下解释原因是:
有符号的8字节能表示的最大数是:0x7fffffffffffffff, 转化为十进制就是9223372036854775807,
如果再+1,就会有符号溢出表示为0x8000000000000000,在转为4字节的类型时保留低32位就是0了
解决方法是换成double类型就ok了。。。。
还求大佬不要喷我这个菜鸟