一.题目链接:https://leetcode.com/problems/reverse-integer/
二.题目大意:
给定一个整数,要求反转该整数之后再返回;如果归返回的整数超过了int型整数的表示范围,则返回0。例如:输入123,返回321。
三.题解:
这道题目在思路上并不难,主要还是在代码的实现上,这里我主要有两种实现方式。
方法1:将数字转换成字符串,然后计算出该字符串的长度,根据长度和字符来生成一个反转后的数字。代码如下:
class Solution {
public:
int reverse(int x) {
stringstream ss;//通过stringstream将int转化成string
ss<<x;
string str = ss.str();
int len = str.size();
int pos[len] = {0};
int num = -1;//根据字符的位置来决定乘以10的num次方
long temp = 0;
int flag = 0;//用于标记是否为负数
for(int i = 0; i < len; i++)
{
if(str[i] == '-')
{
flag = 1;
continue;
}
else
{
num++;
temp += ((str[i] - '0') *pow(10,num));
}
}
if(flag == 1)
temp = -1*temp;
if(temp > (pow(2,31) -1) || temp < -pow(2,31))
temp = 0;
return temp;
}
};
此方法时间复杂度为O(n),空间复杂度为O(n)。
方法2:该方法是直接对整数x进行处理,每次利用x%10来求x的个位的数字,利用x/10来求剩余部位的数字,并利用个位数字进行迭代。代码如下:
class Solution {
public:
int reverse(int x) {
long long num = 0;
while(x)
{
num = num * 10 + x % 10;
x /= 10;
}
return (num > INT_MAX || num < INT_MIN)?0:num;
}
};
这种方法的关键在于:num = num * 10 + x % 10这一步骤,实际上就是每次利用x的个位的数字当做反转后数字的高位数,此处的思想还是非常巧妙的,很值得借鉴!此方法的时间复杂度为O(n),空间复杂度为O(1)。对于此方法有几点需要注意:
1.这种方法,不用区分正负数,因为如果x为负数的话,不论是他的余数还是整除后的结果都是负数。例如-123对10取余数的话,那么结果是-3;整除10的话,结果是-12。
2.此方法,不用预先知道x的位数,每次迭代,上次的个位数就会乘以10(高上1位),这次的个位数就会变成反转后数字的个位数字;所以说这种思想(也可以认为一种技巧)一定要掌握。尤其是”它不用事先知道x的位数”这个重要的性质,以后很可能用得着。