版权声明:未经允许,请勿转载! https://blog.csdn.net/qq_40005658/article/details/88399389
题目内容:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解析:
这道题并不难,最容易想到的就是不停的进行取余和整除,每取出一个数就将其进行取余逆运算,负数不影响运算。这其中要进行判断翻转后的数是否超过整型数据范围。
具体实现代码如下:
public static int reverse1(int x) {
int rev = 0;
while(x != 0) {
int pop = x%10;
x = x/10;
//这里最大数除10,是因为边界问题,当最后个位数进入循环后,
//由于已经除10了,所以最大数也应该除10
if (rev > Integer.MAX_VALUE/10) return 0;
if (rev < Integer.MIN_VALUE/10) return 0;
rev = rev*10 + pop; //得出翻转后的数
}
return rev;
}
时间复杂度:数x每次都会除10,所以设需要n次尽,可以得出10^n = x,得出n=log10(x),所以时间复杂度是:O(log(x))
空间复杂度是:O(1)