回文数の決定



Determination Number Palindromes



方法:数の半分を逆にする
アイデア

頭に浮かぶ最初のアイデアは、数値を文字列に変換し、その文字列が回文であるかどうかを確認することです。ただし、これには、問題の説明で許可されていない文字列を作成するために余分なスペースが必要です。



2番目のアイデアは、数値自体を反転してから、反転した数値を元の数値と比較することです。それらが同じである場合、その数は回文です。ただし、反転数がint.MAXより大きい場合、整数オーバーフローの問題が発生します。

2番目のアイデアによると、デジタル反転によって引き起こされる可能性のあるオーバーフローの問題を回避するために、 text {int} int数の半分だけを反転することを検討してみませんか。結局のところ、番号が回文である場合、その後半は反転され、元の番号の前半と同じである必要があります。



たとえば、1221と入力すると、数値「1221」の後半を「21」から「12」に反転して、前半の「12」と比較できます。 2つは同じであるため、番号1221が回文であることがわかります。

このアイデアをアルゴリズムに変える方法を見てみましょう。

アルゴリズム



まず、いくつかの重大な状況に対処する必要があります。たとえば、すべての負の数を回文にすることはできません。-は3に等しくないため、-123は回文ではありません。したがって、すべての負の数に対してfalseを返すことができます。

それでは、後半の数字を逆にする方法を考えてみましょう。数値1221の場合、1221%10を実行すると、最後の桁が1になります。2番目の桁を取得するには、最初に10で割って、1221から最後の桁を削除します。1221/ 10 = 122次に、前のステップの結果を残りの10で割った結果、122%10 = 2で、最後から2番目の桁を取得できます。最後の桁に10を掛け、最後から2番目の桁1 * 10 + 2 = 12を掛けると、必要な反転数が得られます。このプロセスを続行すると、反転した数値の桁数が増えます。

ここで問題となるのは、反転した桁の桁数が元の桁の半分に達したことをどうやって知るのかということです。

元の数を10で割り、逆数に10を掛けます。したがって、元の数が逆数よりも小さい場合は、半桁の数を処理したことを意味します。

public class Solution { public bool IsPalindrome(int x) { // Special case: // As mentioned above, when x <0, x is not a palindrome. // Similarly, if the last digit of the number is 0, in order to make the number a palindrome, // then its first digit should also be 0 // only 0 satisfies this property if(x revertedNumber) { revertedNumber = revertedNumber * 10 + x % 10 x /= 10 } // When the number length is odd, we can remove the digit in the middle by revertedNumber/10. // For example, when the input is 12321, at the end of the while loop we get x = 12, revertedNumber = 123, // Since the median number does not affect the palindrome (it is always equal to itself), we can simply remove it. return x == revertedNumber || x == revertedNumber/10 } }