整数反转
题目
给你一个 32 位的有符号整数 `x` ,返回将 `x` 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 `[−231, 231 − 1]` ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
题目分析
本题第一反应就是,将整数对于10取余再依次乘以10即可得到反转的结果。 但是需要考虑反转过后的整数是否超过了最大的范围,导致溢出。
以正数进行举例 对于大于 intMax 的讨论,此时 x 一定是正数,pop 也是正数。
- 如果 rev > intMax / 10 ,那么没的说,此时肯定溢出了。
- 如果 rev == intMax / 10 = 2147483647 / 10 = 214748364 ,此时 rev * 10 就是 2147483640 如果 pop 大于 7 ,那么就一定溢出了。但是!如果假设 pop 等于 8,那么意味着原数 x 是 8463847412 了,输入的是 int ,而此时是溢出的状态,所以不可能输入,所以意味着 pop 不可能大于 7 ,也就意味着 rev == intMax / 10 时不会造成溢出。
- 如果 rev < intMax / 10 ,意味着 rev 最大是 214748363 , rev * 10 就是 2147483630 , 此时再加上 pop ,一定不会溢出。
假设反转后的结果为rev,每次除以10取余结果为p,rev依次乘以10,则只需要判断是否满足 rev < Integer.Max_Value/10 = 213748364 不满足条件即为溢出。负数同理。
编码
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 ){
return 0;
}
if (rev < Integer.MIN_VALUE/10 ){
return 0;
}
rev = rev * 10 + pop;
}
return rev;
}
}
时间复杂度: O(log(x))。 空间复杂度: O(1)。
回文数
题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
题目分析
可以直接使用数字反转,然后判断是否相等即可
public boolean isPalindrome(int x){
if (x < 0) {
return false;
}
if (x < 10){
return true;
}
int reverse = reverse(x);
return reverse == x;
}