题目:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路:
如果不用到其他容器,每次都要获取最后一位的数字,方法是与10取余,然后与之前的结果相加,因为新加一位数字,那个之前的结果就要进一位,所以要乘以10。
因为是int类型,所以每次在相加之前就要判断运算后的数据是否超出范围,如果超出直接返回0;
代码如下:
···
public int reverse(int x) {
//结果
int result = 0;
while(x != 0){
//最后一位数
int num = x%10;
x = x/10;
//如果大于最大值 则会走这里
if(Integer.MAX_VALUE/10 < result || (Integer.MAX_VALUE/10 == result && num > Integer.MAX_VALUE%10) ){
return 0;
}else if(Integer.MIN_VALUE/10 > result || (Integer.MIN_VALUE/10 == result && num < Integer.MIN_VALUE%10)){
//如果小于最小值 则会走这里
return 0;
}
result = result*10 +num;
}
return result;
}
···
复杂度分析
时间复杂度:O(log(x)) x为入参,
空间复杂度:O(1)
注:
判断是否超出范围,也可使用Long类型。