整数反転(java)
3941 ワード
例1:入力:123出力:321
注意:我々の環境では32ビット以下の符号付き整数しか記憶できないと仮定すると,その数値範囲は[−2の31方,2の31方−1]である.この仮定に基づいて、反転後に整数がオーバーフローした場合は0を返します.
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
}
まず公式の解題の構想を出して、省の誤導の他の人hiahia~~
この整数のビットpopを順番に取り出し、スタックのようにrevに押し込む過程で、オーバーフローしているかどうかを判断するのも私を困惑させる点です.
サイクル毎にxは/10以降のデータであるため、ここでもIntegerより大きいか否かを比較する.MAX_VALUE/10は、2つの数値が等しい場合、桁数がIntegerより大きいかどうかを比較する.MAX_VALUEの桁数は7桁で、最大数より大きいかどうか、最小数同理かどうかを比較できます.
Integer.MAX_VALUE:2147483647
Integer.MIN_VALUE:-2147483648
サイクル数
pop
x
rev * 10 + pop
1
7
156384
7
2
4
15638
74
3
8
1563
748
4
3
156
7483
5
6
15
74836
6
5
1
748365
7
1
0
7483651
私が考えているのは、このデータをmapで記録し、この整数の長さ/2をループして、最初のmapを取り出すことです.get(0)は、10の(xLength-j-1)次数を乗じ、対応する(xLength-j-i)位置の値を取り出し、10のj次数を乗じる.
考えもいいように見えるが、実際には、多くの場所でオーバーフローしているかどうかの判断を加え、正負数であるかどうかを判断し、論理を増やしなければならない.
私の誤区:sum+=a 1+a 2、3つの数はintタイプで、a 1とa 2がオーバーフローしたとき、本当に正しい値を返すことはありませんので、しばらく見ていましたが、sum値はいつも間違っていました.
1(1)
7(8)
2(5)
6(4)
3(6)
5(7)
4(3)
public static int reverse(int x) {
try {
if (x > Integer.MAX_VALUE || x < Integer.MIN_VALUE) {
return 0;
}
int xTemp1 = x;
// , , map
if (x <= 0) {
x = x *(-1);
}
int xTemp2 = x;
Map map = new HashMap();
int i = 0;
while (xTemp2 != 0) {
map.put(i, xTemp2 % 10);
xTemp2 /= 10;
i++;
}
int xLength = (x + "").length();
long sum = 0;
for (int j = 0; j < xLength / 2; j++) {
//
if (map.get(j) * Math.pow(10, xLength - j - 1) > Integer.MAX_VALUE ||
map.get(j) * Math.pow(10, xLength - j - 1) < Integer.MIN_VALUE) {
return 0;
}
if (map.get(xLength - j - 1) * (int) Math.pow(10, j) > Integer.MAX_VALUE ||
map.get(j) * Math.pow(10, xLength - j - 1) < Integer.MIN_VALUE) {
return 0;
}
//
int a1 = map.get(j) * (int) Math.pow(10, xLength - j - 1);
int a2 = map.get(xLength - j - 1) * (int) Math.pow(10, j);
sum += a1 + a2;
if (sum > Integer.MAX_VALUE || sum < Integer.MIN_VALUE) {
return 0;
}
}
//
if (xLength % 2 == 1) {
int a3 = map.get(xLength / 2) * (int) Math.pow(10, xLength / 2);
sum += a3;
if (sum > Integer.MAX_VALUE || sum < Integer.MIN_VALUE) {
return 0;
}
}
if (xTemp1 <= 0) {
sum *= (-1);
}
if (sum > Integer.MAX_VALUE || sum < Integer.MIN_VALUE) {
return 0;
}
return (int) sum;
} catch (Exception e1) {
return 0;
}
}