题目:给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
解法1:字符串解法
class Solution {
public int reverse(int x) {
int result;
StringBuilder str = new StringBuilder(x+""); //构建字符串
str.reverse(); //翻转字符串
if(x<0){
str = str.deleteCharAt(str.length()-1); //如果是负数除去“-"字符
}
long num = Long.valueOf(str.toString()); //转换为long,不用int是考虑到边界的情况
if(num>Integer.MAX_VALUE){ //超过范围就返回0
result = 0;
}else{
result = (int)num; //强制转换类型
}
return x<0?-result:result; //判断正负返回
}
}
这种解法就是把输入转换为字符串,进行翻转,然后返回对应的正负值
时间复杂度:O(n))
空间复杂度:O(1)
解法2:求余数法
class Solution {
public int reverse(int x) {
long result = 0;
int num = 0;
while((x = x/10) !=0){ //动态改变x的值
num = x % 10; //求得余数
result = result*10+num; //结果拼接
if(result>Integer.MAX_VALUE||result<Integer.MIN_VALUE){
return 0;
}
}
return (int)result;
}
}
这种方法就是求余数,然后把余数拼接起来。
时间复杂度:O(n);
空间复杂度:O(1)
注意:这两个解法都定义了一个long变量,这是为了防止边界的情况,即Integer的最小值-2147483648;当出现这个数值的时候如果用int的话会出现bug;不过题目说了环境只能存储32位的有符号整数,所以还有一点缺陷
解法3:求余数优化版
class Solution {
public int reverse(int x) {
int result = 0;
while (x!=0) {
int temp = result * 10 + x % 10;
if (temp / 10 != result) //溢出后,这里就会不成立了
return 0;
result = temp;
x /= 10;
}
return result;
}
}
这里和解法2是一样的,只不过这里用的是一个除法来判断有没有溢出,而没有创建一个long数值。空间复杂度和时间复杂度和2是一样的;