给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0, 假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
提示:
-2^31 <= x <= 2^31 - 1
思路:
如何取出最后一位呢 ? 直接模上10就行
难点在于反转后溢出的问题,可以利用更大的数据类型来承载,或者根据溢出特征来处理
class Solution {
//方式一: 使用更大的数据类型
public int reverse1(int x) {
/**
之所以用long,是因为int反转后会溢出 所以用更大的数据类型来承接
缺点:如果传入的是long类型 那同样会溢出
*/
long result = 0;
while(x!=0) {
//result乘以10 加上余数
result = result*10 + (x%10);
if(result > Integer.MAX_VALUE) return 0;
if(result < Integer.MIN_VALUE) return 0;
//每次消掉一位
x = x/10;
}
return (int)result;
}
//方式二:利用数据溢出特点
public int reverse(int x) {
int result = 0;
while(x!=0) {
//result乘以10 加上余数
int tmp = result*10 + (x%10);
/**
思考
如果一个值溢出会发生什么❓是不是得到的值是一个不准确的值 ?
反之得到的是准确的值那说明反推回去是成立的; 例如 b = a*10 + m 不溢出时 (b-m)/10 == a
*/
if((tmp - (x%10))/10 != result) return 0;
//来到这里就说明数据正常
result = tmp;
//每次消掉一位
x = x/10;
}
return result;
}
}
注意:以上操作是由java语言实现 ,那在Java中 int 溢出是不会直接崩溃的;而是会截取除高位以外的数据返回;其他语言像C++是会直接崩溃,所以设计算法时要注意
网友评论