您的位置:首页 > 其它

leetcode 之 Reverse Integer

2017-09-13 23:27 337 查看
题目如下:

Example 1: x = 123, return 321;

Example 2: x = -123, return -321;

Attention:The reversed integer might overflow. Assume the input is a 32-bit integer, then the reverse of 1000000003 overflows.

Note: The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.

第一种解法

先把 integer 转换成 string, 然后把 string 的每个元素倒置,最后再把string转换成int,在转换的时候要考虑溢出,如果溢出返回0;因为int本身就为32位,所以我们表示范围可以用常量INT_MININT_MAX表示。代码如下:

class Solution {
public:
int reverse(int x) {
int sign;
string temp = to_string(x);
int n = temp.size();
string cp_temp;
if(temp[0] != '-') {
sign = 1;
for (int i = n - 1; i >= 0; i--) {
cp_temp += temp[i];
}
}
else {
sign = -1;
cp_temp += '-';
for (int i = n - 1; i > 0; i--) {
cp_temp += temp[i];
}
}
int num = 0;
int mark = (cp_temp == '-' ? 1 : 0);
for (; mark < cp_temp.size(); mark++) {
if(num > INT_MAX / 10 || (num == INT_MAX / 10 && (cp_temp[mark] - '0') > INT_MAX % 10)) {
return 0;
}
num = num * 10 + cp_temp[mark] - '0';
}
return num * sign;
}
};


分析:将整数转换为string直接调用函数to_string(),是c++11的新添加的标准。string的倒置的操作为线性复杂度,至于string转换为int,也是用了一个for循环,也是线性的复杂度。总的来说复杂度应为O(n);

第二种解法

不需要int与string之间的转换,直接利用算术方法将整数的各位倒置。

class Solution {
public:
int reverse(int x) {
long num = 0;
int sign = 1;
if(x < 0) {
sign = -1;
x = -1 * x;
}
while(x) {
num = num * 10 + x % 10;
x = x / 10;
}
num = num * sign;
return (num > INT_MAX || num < INT_MIN) ? 0 : num;
}
};


分析:首先声明了一个long型变量用于存放结果,因为结果可能溢出,所以用int可能会出错。先判断符号,如果是负数那么先变号,等其他位都倒置后再把负号还原。用一个循环将位数倒置,最后返回值判断结果是否溢出,如果溢出返回0,否则返回正确结果。算法复杂度也为O(n)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: