ソリューション1:一般的なソリューション
最善の解決策は、最初に整数を文字列に変換してから、文字列を配列に分割することです。対応する要素が等しいかどうかを判断するには、配列の長さの半分だけループする必要があります。
コード実装
Java
///简单粗暴,看看就行
class Solution {
public boolean isPalindrome(int x) {
String reversedStr = (new StringBuilder(x + "")).reverse().toString();
return (x + "").equals(reversedStr);
}
}
ソリューション2:高度なソリューション-数学的ソリューション
比較のために整数の対応する数値を取得するために、四捨五入と剰余演算を行います。
例:番号1221。
1221/1000を計算すると、最初の
ビット1が得られます。1221 %10を計算すると、最後のビット1
が比較され
、22が取り出されて比較が続行されます。
コード実装
Java
class Solution {
public boolean isPalindrome(int x) {
//边界判断
if (x < 0) return false;
int div = 1;
//
while (x / div >= 10) div *= 10;
while (x > 0) {
int left = x / div;
int right = x % 10;
if (left != right) return false;
x = (x % div) / 10;
div /= 100;
}
return true;
}
}
ソリューション3:高度なソリューション-独創的なソリューション
パリンドロームの数を直観的に見ると、それらを1対1で対応しているかどうかを確認するために、数を2つに折るような感覚です。
したがって、このソリューションの操作は、数値の後半を取り出して反転することです。
ここで注意すべき点は、パリンドロームの数は奇数または偶数になる可能性があるため、長さが偶数の場合、半分に折りたたむと等しくなるはずです。長さが奇数の場合は、半分に折りたたんだ後、 1つの長さを削除するには、1桁を削除する必要があります(10で割り、丸めます)。
具体的な方法は次のとおりです。
剰余演算(%10)が実行されるたびに、最小数が取り出されます:y = x%10
取り出された数の最後に最小数が追加されます:revertNum = revertNum * 10 + y
取り出された最小桁ごとに、xは
xがrevertNumより小さいかどうかを判断するために10で除算します。xがrevertNumより小さい場合、それは数が半分または半分以上であることを意味します。
最後に、パリティを決定します。偶数の場合、revertNumとxは等しく、奇数の場合は中央の数revertNumの最下位ビットで、それを10で割ると、xと等しくなるはずです。
コードの実装
class Solution {
public boolean isPalindrome(int x) {
//思考:这里大家可以思考一下,为什么末尾为 0 就可以直接返回 false
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
return x == revertedNumber || x == revertedNumber / 10;
}
}