7.Reverse Integer(Easy)

1777 ワード

Reverse digits of an integer.1つの整数を反転するデジタルExample 1:x=123,return 321 Example 2:x=-123,return-321
穴がないように見えますが、実はそうではないです。この問題にはオーバーフロー処理をする条件が含まれています。つまりIntegerの最大値を超える整数を入力します。
My Solution
(Java)Version 1 Time:43 ms:
まず思いついた方法は、整数を文字列として反転させ、ちょうど先日反転文字列の操作をしました。ここで直接適用します。そして、longタイプで入力したint値を入れることがポイントです。演算にオーバーフローする問題を効果的に避けることができます。
public class Solution {
    public int reverse(int x) {
        if(x>-10&&x<10)
            return x;
        long y = x;
        long z = Math.abs(y);
        boolean isNegative = x > 0;
        String s = String.valueOf(z);
        char[] chars = s.toCharArray();
        char c;
        for (int i = s.length() - 1, j = 0; j != chars.length / 2; i--, j++) {
            c = chars[j];
            chars[j] = chars[i];
            chars[i] = c;
        }
        z = Long.parseLong(String.valueOf(chars));
        if(z>Integer.MAX_VALUE)
            return 0;
        return (int)(isNegative ? z : -1 * z);
    }
}
(Java)Version 2 Time:41 ms:
文字列を除いて、この解法は典型的な直接数字に対して処理して、各位から数字を取って、それから1位は最高位まで取って、1つの新しい数を構成して、結果で、コードは明らかに短くなりました。顔を殴られたようです。文字列を数えるのに時間がかかりました。題目の範囲は整数の範囲だけです。長さが短いため、文字列の反転の利点が現れませんでした。もちろん、leetcodeの尿性によって、この二つの解法は同じ時間の複雑さに属しています。明らかな差はありません。
public class Solution {
    public int reverse(int x) {
        long y;
        long z = x;
        boolean isNegative = x > 0;
        z = Math.abs(z);
        y = z % 10;
        z /= 10;
        while (z != 0) {
            y = y * 10 + z % 10;
            if (y > Integer.MAX_VALUE)
                return 0;
            z /= 10;
        }
        return (int)(isNegative ? y : -1 * y);
    }
}
discussで他のJava解法も大同小異のようです。もっと速くはないです。40 msぐらいですが、同じように直接整数C++を操作しても6 msしかかかりません。