問題
整数 x をx を 10 進数で
- 負の
数は 回文ではない ものとします。 -121を後ろから 読むと 121-になり、 同じ 並びに ならないからです - 0 から 9 までの 1 桁の
数は、 どれも回文です xは -2147483648 以上 2147483647 以下です- 数を
文字列に 直さず、 数のままの 計算だけで 判定してください
入力と出力の例
例 1
桁の
入力
x = 2552出力
true例 2
入力
x = 1534出力
false例 3
負の
入力
x = -404出力
false面接での聞かれ方
面接では、
- 「整数が
回文か どうかを 判定してください」 - 文字列に
直して 逆に した 書き方を 見せると、 「では、 文字列に 直さずに 解けますか?」と続きます - 「負の
数や、 末尾が 0 の 数は どうなりますか?」と、 端の 場合を 聞かれます
文字列に
アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。
まず 考える手順
段 1
まずは
段 2
数のままでx % 10 がx を 10 でback = back * 10 + 桁 と
段 3
全部をx からback にx はback はback が x 以上にx == back、back のback を 10 でx を
段 4
この50 のx が 0、back が 5 に
解答
Python
Python
def is_palindrome_number(x):
if x < 0:
return False
if x % 10 == 0 and x != 0:
return False
back = 0
while x > back:
d = x % 10
back = back * 10 + d
x //= 10
return (
x == back
or x == back // 10
)JavaScript
JavaScript
function isPalindromeNumber(x) {
if (x < 0) {
return false;
}
if (x % 10 === 0 && x !== 0) {
return false;
}
let back = 0;
while (x > back) {
const d = x % 10;
back = back * 10 + d;
x = Math.floor(x / 10);
}
return (
x === back ||
x === Math.floor(back / 10)
);
}Go
Go
func isPalindromeNumber(
x int,
) bool {
if x < 0 {
return false
}
if x%10 == 0 && x != 0 {
return false
}
back := 0
for x > back {
d := x % 10
back = back*10 + d
x /= 10
}
return x == back ||
x == back/10
}JavaScript の / はMath.floor で
計算量
- 時間は O(log x) です。
1 回まわる ごとに xの桁が 1 つ 減り、 半分の 桁を 取り出した ところで 止まります。 いちばん 大きい数でも 5 回ほどです - 使う
記憶は O(1) です。 backと取り出した 桁の 置き場だけです - 文字列に
直す 書き方は、 時間は 同じ O(log x) ですが、 桁の 数だけの 文字列を 作るので 記憶も O(log x) 要ります
よく ある間違い
- 全部の
桁を 逆に した数を作る。 正しく 動く 言語も ありますが、 32 ビットの 整数で 考えると、 2147483647を逆に した 7463847412は入りきらずに あふれます。 後ろ半分だけを 逆に すれば、 backは元の 数より 大きくなりません - 末尾が 0 の
数を 除き忘れる。 半分の 比べ方では、 50や120が回文と 判定されてしまいます。 0 その ものは 回文なので、 x != 0を付けて除きます - 奇数の
桁の 真ん中を忘れる。 x == backだけで比べると、 12321でxが 12、backが 123 になって 偽を 返します。 真ん中の 1 桁は どちらに あっても よいので、 backを 10 で割った 商とも比べます - JavaScript で
x / 10をそのまま使う。 商が 小数に なり、 繰り返しが いつまでも 0 にならず、 答えも狂います
解答を動かした版 Python 3.12.14Node.js 22.23.4Go 1.24.6確認日 2026年10月30日
面接での 話し方の例
書き始める
「文字列に
直せば すぐですが、 数のままで 解きます。 負の 数と、 0 以外で 末尾が 0 の 数は 先に 偽にします。 その あと 10 で 割った 余りで 下の 桁を 取り出して、 後ろ半分だけを 逆に 組み立て、 前半分と 比べます。 半分で 止めるので、 あふれも 起きません。 時間は 桁の 数の 半分で O(log x)、 記憶は O(1) です。」
書き終えたら、
「例 1 の 2552 を
たどります。 2 を 取り出して backが 2、xが 255 です。次に 5 を 取り出して backが 25、xが 25 になり、 xがbackより大きくなくなったので 止めます。 25 と 25 が 同じなので 真を 返します。」
