题目描述:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例:
示例1:
输入: 123 输出: 321
示例2:
输入: -123 输出: -321
示例3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题目难度:简单
分析:
题目比较简单,利用除法和取余就可以完成,需要注意的是数值的范围,那么就需要知道在什么情况下反转的整数会溢出。
代码如下:
java:
class Solution { public int reverse(int x) { // 用来返回的结果 int res = 0; // 需要对x进行取余和除法计算,只要x != 0就继续 while (x != 0) { /* 这里不难想到,因为res每次都需要 * 10, 所以当res > Integer.MAX_VALUE / 10时,再次 * 10 就会溢出,负数同理 */ if(res > Integer.MAX_VALUE / 10 || res < Integer.MIN_VALUE / 10) return 0; // 就一行核心代码:res每次 * 10 再 + 上 x 取模的值 res = res * 10 + x % 10; // x 每次都要 / 10 ,少一位数 x /= 10; } return res; } }
python:
这里python和java不同的是负数的除法,需要注意
class Solution: def reverse(self, x: int) -> int: if x < 0: flag = -1 x = -x else: flag = 1 res = 0 while x != 0: res = res * 10 + x % 10 x //= 10 res *= flag return res if res < 2 ** 31 -1 and res > -2 ** 31 else 0
总结:
时间复杂度为O(log 10 x),x中大约有l o g 10 x 位数字。(因为每次都要除10)。
每次遇到什么反转数字、字符串等,大多用这种思路,都是从后往前,只不过字符串是利用下标。