题7、 整数反转
题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路
除10取余得到末位的值,加到新数的末尾(在此之前需要把新数乘10),原来的数除10减去一位,如此往复,直到原来的数全部循环一遍。
注意对数据溢出的判断,因为计算的时候,如果最终的值溢出了,是不会报错的,仍然会得到一个数据,但是这个数据是错误的,判断溢出应该在计算之前判断,也就是先判断下一次计算是否会溢出,不会的话再计算,溢出返回0。
关于溢出的一点个人看法
计算机在计算的时候是按照补码的形式计算的,溢出之后的值就是按照补码计算之后溢出后经过舍去的值。
另外就是可以把机器中的值理解成一个换−231接下来就是231-1,往复循环。
最后就是在初始化值的时候,如果一个值溢出了是会报错的,但是计算过程中出现溢出不会报错,必须手动处理。
代码
public class T007 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println( reverse( 102 ) );
}
//我的最优解
public static int reverse(int x) {
int output = x%10;
int next = x/10;
//当剩余的数为0结束循环
while( next != 0 ) {
//判断下一次计算的值是否会溢出,即下一次计算后除最高位外的值大于等于147483647且最高位大于等于2(正向溢出)
//或者下一次计算后除最高位外的值小于等于-147483648且最高位大于等于2(负向溢出)
if( ( (output%100000000 * 10 + next%10) >= 147483647 && output/100000000 >= 2) ||
( (output%100000000 * 10 + next%10) <= -147483648 && output/100000000 <= -2) )
return 0;
//计算
output = output*10+next%10;
next = next/10;
}
return output;
}
//另一种看似简单,实际上复杂的一匹的算法
//验证我直接拿题8的用了
public static int reverse1(int x) {
String input = (x+"");
String output = "";
for( int i = input.length()-1; i >= 0; i-- ) {
if( input.charAt(i) == '-' ) {
output = input.charAt(i) + output;
}else if( input.charAt(i) == '+' ) {
;
}else {
output += input.charAt(i);
}
}
//判断是否越界了
//当字符串长度大于11的时候无论是正还是负,均已经越界,等于11的时候正数越界,负数(因为有负号,实际数字长度为10)再进行下一步判断
if( output.length() >= 11 ) {
//判断是正还是负,正就直接返回越界的信息,负再进行下一步判断
if( output.charAt(0) == '-' ) {
//判断字符串长度是否等于11是就进行下一步判断,否则返回越界信息
if( output.length() == 11 ) {
//当第一位数字大于2的时候,必定越界,等于2再判断,等于1不越界
if( output.charAt(1) > 50 ) {
return 0;
}else if( output.charAt(1) == 50 ) {
//等于2的时候再对接下来的几位进行判断,这个时候可以去掉一位可以直接转换为整型数判断大小
//大于147483648越界,否则不越界
if( Integer.parseInt( output.substring(2)) > 147483648 )
return 0;
}
}else
return 0;
}else
return 0;
//长度为10的时候负数必定不越界,正数进行判断,方法同上
}else if( output.length() == 10 ) {
if( output.charAt(0) != '-' ) {
if( output.charAt(0) > 50 ) {
return 0;
}else if( output.charAt(0) == 50 ) {
if( Integer.parseInt( output.substring(1)) >= 147483647 )
return 0;
}
}
}
return Integer.parseInt(output);
}
}