[アルゴリズム問題の解決策] LeetCode9。回文数

トピック

整数が回文であるかどうかを判別します。回文数は、正の順序(左から右)と逆の順序(右から左)の両方で同じ整数を参照します。
上級:
整数を文字列に変換せずにこの問題を解決できますか?

解決策1

文字列に変換して、回文文字列かどうかを判断します。

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) {
            return false;
        }
        String str = String.valueOf(x);
        int length = str.length();
        for(int i = 0; i < length / 2; i++) {
            if(str.charAt(i) != str.charAt(length - 1 - i)) {
                return false;
            }
        }
        return true;
    }
}

解決策2

数値の各桁を分解し、配列に変換してから判断します

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) {
            return false;
        }
        int[] digit = new int[10];
        int i = 0;
        while(x > 0) {
            digit[i++] = x % 10;
            x = x / 10;
        }
        for(int j = 0; j < i / 2; j++) {
            if(digit[j] != digit[i - 1 - j]) {
                return false;
            }
        }
        return true;
    }
}

解決策3は、比較のために数値の半分だけを逆にします

最初の2つの方法では、変換文字列を使用し、追加の配列を使用します。実際、より良い解決策があります。反転できるのは後半のみで、反転後の前半と一致している場合は、回文数であることを意味します。

ご存知のとおり、10で割った余り+ 10で割った余りを使用して、最後の桁を取得できます。では、数字の半分が変換されたとどのように判断するのでしょうか。実際、変換の過程で、結果の数は常に大きくなりますが、元の数は常に小さくなります。元の数値が結果の数値以下の場合、半分または半分プラス1が変換されることを意味します(奇数の場合)。

注意すべきもう一つのことは、数を逆にする上記のプロセスです。10の倍数(10の倍数は0以外の回文数ではありません)では不要であり、最後のステップでの奇数桁の特殊処理で間違いを犯しやすいです。したがって、10の倍数は、負の数のような特殊なケースとして扱うことができます。

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }

        int revert = 0;
        while(x > revert) {
            revert = revert * 10 + x % 10;
            x = x / 10;
        }

        return (revert == x) || (revert / 10 == x);
    }
}

おすすめ

転載: blog.csdn.net/vxzhg/article/details/106673516