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