leetcode之整数反转
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
题解
class Solution {
public int reverse(int x) {
int reverse = 0;
while (x != 0) {
if (reverse > Integer.MAX_VALUE / 10 || reverse < Integer.MIN_VALUE / 10 ){
return 0;
}
reverse = reverse * 10 + x % 10;
x /= 10;
}
return reverse;
}
}
思路
每一位上取余,获取那一位上的位数,然后除10减一位。每次循环把获得余数和上一位的数字乘以10相加。
另外就是要判断是否溢出,会溢出的地方就是
reverse = reverse * 10 + x % 10;
所以我们判断
- 如果reverse大于INTMAX/10,那么reverse一定溢出
- 如果reverse==INTMAX/10,同时x % 10 > 7 一定会溢出,因为INTMAX是2147483647,最后一位是7。
ps:负数类似。但是第二个条件其实不用判断因为整数反转的最后一位一定是1或者2不会大于7的。
总结
最近面试,碰到稍微难点的算法题就挂了。哎,出来混的,迟早要还的。大学没有好好学习算法,希望现在努力还不算太晚。