给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
难度:简单 题目地址:https://leetcode-cn.com/problems/reverse-integer/
int reverse(int x){
long res = 0;
while(x != 0){
res = res * 10 + x % 10;
if (res > INT_MAX || res < INT_MIN) {
return 0;
}
x /= 10;
}
return res;
}
解释: 直接倒序翻转x,判断res是否溢出,如果溢出直接返回0。
知识点回顾: INT_MAX和INT_MIN表示C语言中int的上下限,在标准头文件limits.h中定义。
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
}
解释: 方法:弹出和推入数字 & 溢出前进行检查,我们可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。
反转整数的方法可以与反转字符串进行类比。我们想重复“弹出” xxx 的最后一位数字,并将它“推入”到 rev的后面。最后,rev 将与 xxx 相反。要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法。
但是,这种方法很危险,因为当 temp=rev*10+pop 时会导致溢出。
幸运的是,事先检查这个语句是否会导致溢出很容易。
为了便于解释,我们假设 rev 是正数。
如果 temp=rev*10+pop 导致溢出,那么一定有 rev≥INTMAX/10。
如果 rev>INTMAX/10,那么 temp=rev*10+pop一定会溢出。
如果 rev==INTMAX/10,那么只要 pop>7,temp=rev*10+pop 就会溢出。
当 rev为负时可以应用类似的逻辑。
知识点回顾: 判断溢出的方法。
class Solution:
def reverse(self, x: int) -> int:
flag = -1 if x < 0 else 1
res = flag * int(str(abs(x))[::-1])
return res if (-2**31)<=res<=(2**31-1) else 0
解释: 利用切片进行反转,加上了对溢出的判断。
知识点回顾: 数字类型之间的转化,切片的使用。判断溢出的方法。数值对象不可能之间用切片。
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
var re = 0;
while (parseInt(x / 10)) {
re = 10 * re + x - 10 * parseInt(x / 10);
x = parseInt(x / 10);
}
if (re > 214748364 || re < -214748364) return 0;
if ((re == 214748364 && x > 7) || (re == 214748364 && x < -8)) return 0;
re = 10 * re + x;
return re
};
解释: 类似于Java求解的思路。
知识点回顾:
1、parseInt() 函数可解析一个字符串,并返回一个整数。
语法:parseInt(string, radix)
string:必需。要被解析的字符串。
radix:可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
返回值:返回解析后的数字。
说明:当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
举例,如果 string 以 “0x” 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。