题意:
方法一:
模拟
思路:
直接模拟。
用 flag 判断正负,x 计算数的绝对值。
最后判断边界:是否大于正数的最大值 or 小于负数的最小值。
class Solution {
public:
int StrToInt(string s) {
int len=s.size();
long long x=0;
int flag=0;//0表示正数,1表示负数
int f=0;
int num=0;
for(int i=0;i<len;i++){
if(f==0&&s[i]=='+'){//正号
flag=0;
num++;
}else if(f==0&&s[i]=='-'){//负号
flag=1;
num++;
}else if(f==0&&s[i]==' '){//空格
continue;
}else if(isdigit(s[i])){//数字
if(num>1)
return 0;
x=x*10+(s[i]-'0');
f=1;
if(x>(1ll<<31))
break;
}else{
break;
}
}
// cout << flag << endl;
if(flag==0&&x>(1ll<<31)-1){//大于正数的最大值
return (1ll<<31)-1;
}
if(flag==1&&x>(1ll<<31)){//小于负数的最小值
return 0-(1ll<<31);
}
if(flag==1)//负数
return 0-x;
return x;//正数
}
};
时间复杂度:
空间复杂度:![]()
方法二:
java实现
思路:思路参照方法一。
直接模拟。
但要注意 java long类型是8个字节,而且还要强制类型转换。
import java.util.*;
public class Solution {
public int StrToInt (String s) {
int len=s.length();
long x=0;
int flag=0;//0表示正数,1表示负数
int f=0;
int num=0;
for(int i=0;i<len;i++){
if(f==0&&s.charAt(i)=='+'){//正号
flag=0;
num++;
}else if(f==0&&s.charAt(i)=='-'){//负号
flag=1;
num++;
}else if(f==0&&s.charAt(i)==' '){//空格
continue;
}else if(s.charAt(i)>='0'&&s.charAt(i)<='9'){//数字
if(num>1)
return 0;
x=x*10+(s.charAt(i)-'0');
f=1;
if(x>(1l<<31))
break;
}else{
break;
}
}
// cout << flag << endl;
if(flag==0&&x>(1l<<31)-1){//大于正数的最大值
return (int)((1l<<31)-1);
}
if(flag==1&&x>(1l<<31)){//小于负数的最小值
return (int)(0-(1l<<31));
}
if(flag==1)//负数
return (int)(0-x);
return (int)x;//正数
}
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号