整数反転(java)

3941 ワード

  • 問題
  • 32ビットのシンボル付き整数を与えます.この整数の各ビットの数字を反転する必要があります.
    例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;
            }
        }