数学LeeCode7.整数反转
Posted chenry777
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学LeeCode7.整数反转相关的知识,希望对你有一定的参考价值。
给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
题解一:修改最终rev类型为long
第一反应就是, 取余得到个位数,然后除以 10 去掉个位数,然后用一个变量保存倒置的数。
- 一个整数%10得到该整数的个位数,/10得到该整数的前几位(除最后一位),要实现整数的翻转,只需要在以整数x!=0为条件的循环体内,令y = x%10 , x /= 10 ,rev = 0 , rev = rev*10+ y 即可
并且要考虑到返回值rev的范围 [−2147483648,2147483647],所以在输出前作一个判断。
class Solution {
//解法1.修改最终rev类型为long
public int reverse(int x) {
long rev = 0;
while(x != 0) {
int y = x % 10;
x /= 10;
rev = rev * 10 + y;
}
if (rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE) return 0;
return (int)rev;
}
}
时间复杂度:
10^(n-1) = x => n-1 = log10(x) => n=log10(x) + 1
所以时间复杂度是:O(log(x))
空间复杂度:O(1)
题解二:在rev * 10 前判定rev的值
1.对于大于 intMax 的讨论,此时 x 一定是正数,y 也是正数。
- 如果 rev > intMax / 10 ,那么没的说,此时肯定溢出了。
- 如果 rev == intMax / 10 = 2147483647 / 10 = 214748364 ,此时 rev * 10 就是 2147483640 如果 y大于 7 ,那么就一定溢出了。但是!如果假设 y等于 8,那么意味着原数 x 是 8463847412 了,输入的是 int ,而此时是溢出的状态,所以不可能输入,所以意味着 y不可能大于 7 ,也就意味着 rev == intMax / 10 时不会造成溢出。
- 如果 rev < intMax / 10 ,意味着 rev 最大是 214748363 , rev * 10 就是 2147483630 , 此时再加上 y,一定不会溢出。
2.对于小于 intMin 的讨论同理。
class Solution {
//解法2.在rev * 10 前判定rev的值
public int reverse(int x) {
int rev = 0;
while(x != 0) {
int y = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 || rev < Integer.MIN_VALUE/10) return 0;
rev = rev * 10 + y;
}
return rev;
}
}
时间复杂度和空间复杂度同上
题解三:计算digit位数来作为翻转循环判定条件
class Solution {
public int reverse(int x) {
long rev = 0;
//总位数
int digit = (int) (Math.log(x) / Math.log(10) + 1);
for (int i = 0;i < digit;i++){
int y = x % 10;
x /= 10;
rev = rev * 10 + y;
}
if (rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE) return 0;
return (int)rev;
}
}
时间复杂度和空间复杂度同上
以上是关于数学LeeCode7.整数反转的主要内容,如果未能解决你的问题,请参考以下文章