LeetCode-探索-一次-文字列-整数反転-java

2597 ワード

32ビットのシンボル付き整数を与えます.この整数の各ビットの数字を反転する必要があります.
例 1:
  : 123
  : 321

 例2:
  : -123
  : -321

例3:
  : 120
  : 21

注意:
我々の環境では32ビットの符号付き整数しか記憶できないと仮定すると、その数値範囲は [−231,  231 − 1].この仮定に基づいて、反転後に整数がオーバーフローした場合は0を返します.
方法はたくさんあります.最初の方法は:
反転に関連する限り、まず配列内の反転方法を考えます.
1 intをStringに変換し、char[]に変換
2 char[]で反転を完了
3オーバーフロー判定
public int reverse(int x) {
        int signal = 1;
        if (x < 0)
            signal = -1;
        String target = signal * x + "";    //omit the signal
        char[] chars = target.toCharArray();
        char temp = 0;
        int symmetryI = 0;
        for (int i = 0 ; i < target.length() >> 1 ; i ++) {
            symmetryI = target.length() - 1 - i;
            temp = chars[i];
            chars[i] = chars[symmetryI];
            chars[symmetryI] = temp;
        }
        int result = 0;
        try {
            result = signal * Integer.parseInt(new String(chars));
        } catch (NumberFormatException e) {
            result = 0;
        }
        return result;
    }

2つ目の方法:
反転にかかわるものは、スタックというデータ構造を思わないのは難しいです.はい、スタックを通じて反転することができます.
public int reverse1(int x) {
        java.util.Stack stack = new java.util.Stack();
        int signal = 1;
        if (x < 0)
            signal = -1;
        String target = signal * x + "";
        char[] chars = target.toCharArray();
        for (int i = 0 ; i < chars.length ; i ++)
            stack.push(chars[i]);
        for (int i = 0 ; i < chars.length ; i ++)
            chars[i] = (char)stack.pop();
        int result = 0;
        try {
            result = Integer.parseInt(new String(chars));
        } catch (NumberFormatException e) {
            result = 0;
        }
        return signal * result;
    }

3つ目の方法:
整数型であるため(あるいは数値型がより適切である)、数学的な方法で数値の逆転を行うことができます.
数値反転はオーバーフローの問題を考慮する必要があります.
public int reverse0(int x) {
        int result = 0;
        while (x != 0) {
            int digit = x % 10;  //get the last digit of x.
            if (result > Integer.MAX_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && digit > 7) ||
                    result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && digit < -8))
                return 0;
            result = result * 10 + digit;
            x = x / 10;    //make the digit before the last become the last one.
        }
        return result;
    }