アルゴリズム概要

問題

32bit符号付き整数 x の桁を反転し、結果が [-2³¹, 2³¹-1] の範囲外になる場合は 0 を返します。64bit整数の使用は禁止されています。

入出力例

Input: x = 123
Output: 321

Input: x = -123
Output: -321

Input: x = 120
Output: 21

Input: x = 2147483647
Output: 0 (範囲外)

制約

戦略

主要ポイント

✓ 時間計算量: O(d) — d は桁数(最大10)

✓ 空間計算量: O(d) — 文字列スライスで一時領域

CPythonの str(), スライス [::-1], int() はC実装で最適化されており、数値逐次処理より高速です。

ステップバイステップ解説

Python実装

from __future__ import annotations

class Solution:
    """
    Reverse Integer (LeetCode #7)
    32-bit 符号付き整数 x の数字を反転。範囲外は 0 を返す。
    """

    # 32bit境界定数(クラス定数として明示)
    INT_MAX: int = 2_147_483_647   #  2^31 - 1
    INT_MIN: int = -2_147_483_648  # -2^31

    def reverse(self, x: int) -> int:
        """
        文字列反転法による最速実装

        Args:
            x: 32-bit signed integer

        Returns:
            反転後の整数(範囲外は 0)

        Time: O(d), Space: O(d) — d は桁数(最大10)
        """
        # 基底条件: 1桁はそのまま返す(早期リターン)
        if -9 <= x <= 9:
            return x

        # 符号を分離して絶対値の文字列を反転
        sign: int = -1 if x < 0 else 1
        abs_x: int = -x if x < 0 else x

        # C実装の高速な文字列処理を活用
        # [::-1] スライスで反転、int() で整数化(先頭ゼロは自動削除)
        rev_abs: int = int(str(abs_x)[::-1])

        # 符号を適用
        result: int = rev_abs * sign

        # 32bit範囲チェック(Pythonの任意精度intを手動で拘束)
        if result < self.INT_MIN or result > self.INT_MAX:
            return 0

        return result

フローチャート

開始 -9 <= x <= 9 1桁判定 はい x をそのまま返す 早期リターン いいえ 符号を分離 sign, abs_x str(abs_x)[::-1] 文字列反転 int() で整数化 先頭ゼロ自動削除 result = rev * sign 符号適用 INT_MIN <= result <= INT_MAX いいえ 0 を返す オーバーフロー はい result を返す 成功

フローの説明:
1. 1桁判定で早期リターン(-9 ≤ x ≤ 9)
2. 符号を分離し、絶対値を文字列に変換
3. [::-1] で反転し、int() で整数化
4. 符号を適用して元の符号を復元
5. 32bit範囲チェックで範囲外なら 0 を返す
6. 範囲内なら result を返す

計算量分析

時間計算量: O(d)

空間計算量: O(d)

手法比較

手法 時間 空間 Python実装 備考
文字列反転法 O(d) O(d) 最速 C実装の恩恵で高速
数値のみ(divmod) O(d) O(1) 中速 ループで逐次処理
負数のまま処理 O(d) O(1) 中速 分岐が増えがち