足す前に あふれを 確かめながら、 32 ビットの 整数の 桁を 逆順にする
32 ビットの
海外で定番の問題リスト 4 本には入っていません
問題
32 ビットのx を
- 逆に
した数の 頭に 来る 0 は 消えます。 -560は-65です - 逆に
した 数が、 32 ビットの 符号つき整数の 範囲 (-2147483648 以上 2147483647 以下 ) を 出る ときは 0 を返します xも同じ 範囲の整数です - 途中の
計算でも、 この 範囲を 出る 値を 持たない 書き方に してください。 64 ビットの 整数の 型に 移して 最後に 範囲を 確かめる 書き方は 使いません
入力と出力の例
例 1
例 2
負の
例 3
逆に
面接での聞かれ方
面接では、
- 「整数の
桁を 逆に してください。 32 ビットに 収まらないなら 0 を 返してください」 - 64 ビットの
型で 計算してから 範囲を 確かめる 書き方を 見せると、 「32 ビットの 型しか 無いとしたら?」と続きます - 「負の
数で、 余りの 符号は 言語に よって 違いませんか?」と 聞かれる こともあります
芯は、
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
アルゴリズムのチートシートの「配列と文字列」に、
関わる学び
配列と
まず 考える手順
段 1
桁のout を out * 10 + 桁 で
段 2
out * 10 + 桁 がout が 214748364 よりout が
段 3
負のout が -214748364 よりx が% は 0 の% は
解答
Python
Python
def reverse_integer(x):
top = 214748364
out = 0
while x != 0:
if x > 0:
d = x % 10
else:
d = -(-x % 10)
x = (x - d) // 10
if out > top or (
out == top and d > 7
):
return 0
if out < -top or (
out == -top and d < -8
):
return 0
out = out * 10 + d
return outJavaScript
JavaScript
function reverseInteger(x) {
const top = 214748364;
let out = 0;
while (x !== 0) {
const d = x % 10;
x = Math.trunc(x / 10);
if (
out > top ||
(out === top && d > 7)
) {
return 0;
}
if (
out < -top ||
(out === -top && d < -8)
) {
return 0;
}
out = out * 10 + d;
}
return out;
}Go
Go
func reverseInteger(x int) int {
const top = 214748364
out := 0
for x != 0 {
d := x % 10
x /= 10
if out > top ||
(out == top && d > 7) {
return 0
}
if out < -top ||
(out == -top && d < -8) {
return 0
}
out = out*10 + d
}
return out
}Go の int は 64 ビットなので、(x - d) // 10 は、d を
計算量
- 時間は O(log |
x| ) です。 桁の 数だけ 回り、 32 ビットなら 10 回までです - 使う
記憶は O(1) です - 文字列に
直して 逆に する 書き方も 時間は 同じですが、 負の 符号と 頭の 0 の 扱い、 範囲の 確かめを 別に 書く ことになります
よく ある間違い
- 積んだ後で
範囲を 確かめる。 32 ビットの 型だと、 あふれた 瞬間に 値が 回り込み、 範囲の 外か どうかが 分から なくなります。 積む前に 確かめます - 負の
数を 絶対値に してから 逆にする。 32 ビットの 型では、 -2147483648 の 絶対値 2147483648 が 入りません - Python の
%を負の 数に そのまま使う。 -560 % 10は 0 ですが、-561 % 10は 9 になり、 桁が ずれます。 符号を 付け直すか、 絶対値で 取り出します - JavaScript で
x / 10をそのまま使う。 商が 小数に なり、 繰り返しが 0 に なりません。 Math.truncで 0 の向きに 切り捨てます。 負の 数で Math.floorを使うと、 -56 が -6 に なって 桁が狂います
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「10 で
割った 余りで 下の 桁を 取り出し、 答えを 10 倍して 足していきます。 あふれた 後では 気づけないので、 積む前に 確かめます。 最大は 214748364 の 10 倍に 7 を 足した 数なので、 答えが 214748364 より 大きいか、 等しくて 桁が 7 より 大きければ 0 を 返します。 負の 側は -214748364 と -8 で 同じように 見ます。 時間は 桁の 数だけ、 記憶は O(1) です。」
書き終えたら、
「例 2 の -560 を
たどります。 一の 位は 0 で 答えは 0、 残りは -56 です。 次は -6 で 答えは -6、 残りは -5 です。 最後は -5 で 答えは -65 です。 どの 段でも -214748364 より 大きいので、 そのまま -65 を 返します。」