以一个考古题开始新的一天,训练一下自己的代码能力,题意就不贴了,说下注意点吧:
- 先除去开始的空格
- 判断正负
- 开头的0舍去
- 溢出判断
我做了两个,第一段代码没有经过优化,一遍ac,但是问题很多,所以优化了一下成了第二段代码。
class Solution {
public:
int strToInt(string str) {
int len=str.length();
if(len==0)
return 0;
int index=0;
int sign=1;
long long sum=0;
while(Isspace(str[index])) //跳过空格
{
index++;
}
if(Isnotlegal(str[index])) //判断正负且判断是否是数字
{
if(str[index]=='+')
{
index++;
}
else if(str[index]=='-')
{
sign=-1;
index++;
}
else
return 0;
}
while(str[index]=='0') //除去开头的0
{
index++;
}
int maxlen=0;
while(!Isnotlegal(str[index])) //判断溢出
{
sum=sum*10+str[index]-'0';
index++;
maxlen++;
if(maxlen>10)
{
break;
}
}
sum=sum*sign;
if(sum<=INT_MIN)
{
return INT_MIN;
}
else if(sum>=INT_MAX)
{
return INT_MAX;
}
else
{
int res=sum;
return res;
}
return 0;
}
bool Isspace(char c)
{
if(c==' ')
return true;
return false;
}
bool Isnotlegal(char s)
{
if(s<'0'||s>'9')
return true;
return false;
}
};
这段代码虽然可以使用但是很明显不是最优解,首先,使用了long long类型来辅助计算,其次,代码比较冗余。
基于此基础上,对代码进行精简,主要对于溢出的判断,其实就是看加到这个数的时候是否出现了溢出,那我们其实可以在加之前先进行判断,而后选择是否加减,(其实第一版就要用此方法来着,但是为了追求速度,就先long过了),因此可以进行优化。
优化后代码如下:
class Solution {
public:
int strToInt(string str) {
int len=str.length();
if(len==0)
return 0;
int sum = 0;
int index = 0;
int sign = 1;
while (Isspace(str[index]))
index++;
if (str[index] == '-')
sign = -1;
if (str[index] == '-' || str[index] == '+')
index++;
while(index < len && Islegal(str[index])) {
int tmp = str[index] - '0';
// int范围 (-2147483648 ,2147483647),所以可以在num后缀前先判定是否可能溢出,溢出有两种情况,一个是无论后面加什么都会溢出,一个是当个位数小于最大的7时才不会溢出
if ((sum > INT_MAX/10) || (sum == INT_MAX/10 && tmp > 7)) {
return sign > 0 ? INT_MAX : INT_MIN;
}
sum = sum*10 + tmp; //此处可以将开头的0去掉,0再加也是0
index++;
}
return sign > 0 ? sum : -sum;
}
bool Isspace(char c)
{
if(c==' ')
return true;
return false;
}
bool Islegal(char s)
{
if(s<'0'||s>'9')
return false;
return true;
}
};
以后要开始用java做题了,冲冲冲。
新的一天,加油!