今天下班时间比较晚,回来后只学习了一道算法,反转整数,下面开始记录题以及自己的分析。
反转整数
给定一个 32 位有符号整数,将整数中的数字进行反转。
示例1:
输入: 123
输出: 321
示例2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
给定一个 32 位有符号整数,将整数中的数字进行反转。
假设环境只能存储32位有符号整数,其数值范围是 [−2^31, 2^31−1]。根据这个假设,如果反转后的整数溢出,则返回 0。
根据题目判断类似于反转字符串,首先自己不假思索的用StringBuilder进行了实现,但是这样的话自己认为根本就不叫算法题,因此自己重新思考去实现,思路如下:
首先对一个数进行整除然后while循环,之后再进行赋值操作
int num = 0;
while(x!=0){
num = num*10+x%10;
}
但是该方法并没有进行越界处理,当写出来之后查看解析发现处理的很巧妙:
public int reverse(int x) {
int num = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (num > Integer.MAX_VALUE/10 || (num == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
if (num < Integer.MIN_VALUE/10 || (num == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
num = num * 10 + pop;
}
return num;
}
思想是如果num大于Integer的最大边界/10则后面其无论加多少值都为越界,同样的道理因为题目规定最大值为2^31-1为2147483647,如果num==Integer.MAX_VALUE/10,则pop大于7之后则将越界;负数同样为该原理,查看解析后发现处理很是巧妙,自己需要学的地方还是很多,继续加油!