题意:
方法一:
模拟
思路:
直接模拟。
用 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;//正数 } }
时间复杂度:空间复杂度: