题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); 
    }

}
发布了25 篇原创文章 · 获赞 0 · 访问量 124

猜你喜欢

转载自blog.csdn.net/weixin_45980031/article/details/103465949