7つの質問、整数逆転

タイトル

32ビット符号付き整数を与え、あなたはそれぞれ逆に、この整数値を必要とします。

実施例1:
入力:123
出力:321

例2:
入力:-123
出力:-321

実施例3:
入力:120
出力:21

注:
我々は32ビット符号付き整数を格納することができる環境があると、その値が範囲内にある[-2 31は、 2 31れている - 1] 整数オーバーフローの後、それは0を返し、逆ならば、この仮説によるとしてください。

思考

10以上は最後のものの値を取得とることに加えて、新しい番号は、再び完全な円の元の数まで、等々10マイナス1、及び、元の番号に加えて、(新しい番号10を取る必要がある前に)最後に追加されます。

データのオーバーフローの注意判断、オーバーフローの最終値は、与えられていない場合は、時間の計算は、まだデータを取得しますが、データが間違っているので、判断が最初の判断があるオーバーフローを計算する前に決定する必要があります次の計算はない場合には、再計算、オーバーフローリターン0をオーバーフローします。

個人ビューのオーバーフローについて

コンピュータは、計算された値で計算さ補数に応じて、ある場合に値を丸めた後のオーバーフローを介して次の補数のオーバフローに応じて算出されます。
他は、機械の値は変化を意味すると理解されてもよい-2 31は、次の二つである31である -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