一、整数反转
题目:
给定一个 32 位有符号整数,将整数中的数字进行反转。
示例1:
输入:123
输出:321
示例2:
输入:-123
输出:-321
示例3:
输入:120
输出:21
注意:假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
思路:
弹出(栈)和压入(队列)但是根据题目的要求,我们要在溢出前进行检查。所以弹出每个元素,并且入队列后,要进行检查是否会溢出,就是该元素入队列后会不会发生溢出。因为是整数的反转,所以要首先分离出每个元素。通过x%10的数学方法就可以取出最后的一个元素。此时将(x%10)*10进行累加,但是在这之前要判断之前累加的值是否超过了数值范围。假设之前的累加为rev是否大于INT_MAX/10或是否小于INT_MIN/10 还有一种情况就是之前的rev==INT_MAX rex==INT_MIN了,此时要判断目前拿出来的那个数字是否大于7或者是否小于-8 若大于或者小于都会发生溢出。
代码:
class Solution {
public:
int reverse(int x) {
int pop=0;
int rev=0;
while(x!=0)
{
pop = x%10;
x = x/10;
if(rev > INT_MAX/10 || (rev==INT_MAX&&pop>7))
{
return 0;
}
if(rev < INT_MIN/10 || (rev==INT_MIN && pop<-8))
{
return 0;
}
rev = rev*10+pop;
}
return rev;
}
};
二、字符串转化为整数(myatoi)
实现 atoi
,将字符串转为整数。
在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
思路:
根据题目要求,我们首先要判断是正还是负,是否超出了范围,或者若开头不是正负号也不是数字而是其他字符的话返回0,还有最重要的空格处理。数字的ASSIC码是48-57,字符型转为整数的话需要在该ASSIC码的基础上减去48。所以首先我们要除去空格,然后再判断是否返回0或者是正是负,之后再用整数反转的那个方法,在每个数字累加之前判断是否有溢出。
代码:
class Solution {
public:
int myAtoi(string str){
int len = str.size();
int i=0,j=0;
int positive=0;//整数标记
int negative=0;//负数标记
vector <int>vi;
for(i=0; i<len; i++)//从空格之后处理
{
if(str[i]==32)
{
continue;
}
else
{
break;
}
}
if((str[i]<48||str[i]>57)&&(str[i]!=45&&str[i]!=43))//判断是否属于返回0的条件
{
return 0;
}
if(str[i]==45)//判断空格后的第一个字符是正还是负
{
negative = 1;
i = i+1;
}
else if(str[i]==43){
positive = 1;
i = i+1;
}
else
{
positive = 1;
}
for(j = i; j<len; j++)//将要转换的字符部分放入vector容器
{
if(str[j]<48 || str[j]>57)
{
break;
}
else{
vi.push_back(str[j]-48);
}
}
int pop=0,sum=0;
int length = vi.size();
for(int a=0; a<length; a++)
{
pop = vi[a];
if(((sum>INT_MAX/10)|| (sum==INT_MAX/10 && pop>7))&&(positive))//判断是否溢出
{
return INT_MAX;
}
if((((-sum)<INT_MIN/10) ||((-sum)==INT_MIN/10 && (-pop)<-8))&&(negative))
{
return INT_MIN;
}
sum = sum*10+vi[a];
}
if(negative)//若是负数则进行-号计算
{
return (-sum);
}
else{
return sum;
}
}
};