Leetcode-7-反転整数

2149 ワード

32ビットの符号付き整数を指定し、整数の数値を反転します.
例1:
  : 123
  : 321

例2:
  : -123
  : -321

例3:
  : 120
  : 21

注意:我々の環境では32ビットの符号付き整数しか記憶できないと仮定し,その数値範囲は[−2の31次,2の31次−1]である.この仮定によれば,反転後の整数がオーバーフローすると0を返す.
分析:
タイトルの意味は简単で、数字のビットを反転しますが、与えられたデータ型はint型で、値の范囲があることに注意して、javaの中でInteger.MAX_を使うことができますVALUEとInteger.MIN_VALUEで表します.一方、反転後の値がIntegerの値範囲を超えるとオーバーフローし、オーバーフロー後にオーバーフローしたことがわかりませんので、より大きな値範囲を表すデータ構造でデータを格納し、longタイプで結果を格納し、Integerの値範囲を超えたか否かを判断する必要があります.最後にintタイプのデータに変換して返します.
解法1:
この方法では、数値を文字列に変換し、文字列を前後に反転することを考慮します.具体的には、次のようになります.
    public int reverse(int x) {
        boolean negative = x < 0;
        
        char[] chars = String.valueOf(x).toCharArray();
        int length = chars.length;

        for (int i = 0; i < length / 2; i++) {
            chars[i] ^= chars[length - 1 - i];
            chars[length - 1 - i] ^= chars[i];
            chars[i] ^= chars[length - 1 - i];
        }

        int pow = 0;
        long result = 0;

        for (int i = length - 1; i >= 0; i--) {
            if ("-".equals(String.valueOf(chars[i]))) {
                continue;
            }
            result += Long.parseLong(String.valueOf(chars[i])) * (long) Math.pow(10, pow);
            pow += 1;
        }

        if (negative) {
            result *= -1;
        }

        if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
            return 0;
        }
        return (int) result;
    }

解法2:
この方法では,数字を文字に変換することなく,より簡潔な方法を用いて,10の型取り方法を用いて伝達パラメータの各具体的な数字を取り出した.具体的なコードは以下の通りです.
    public static int reverse(int x) {
        boolean negative = x < 0;
        if (negative) {
            x *= -1;
        }

        long result = 0;
        while (x > 0) {
            result = result * 10 + x % 10;
            x /= 10;
        }

        if (negative) {
            result *= -1;
        }

        if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
            return 0;
        }
        return (int) result;
    }