足す前にあふれを確かめながら、32 ビットの整数の桁を逆順にする

32 ビットの符号つき整数の 10 進の桁を逆順にした数を返し、範囲を出るなら 0 を返します。64 ビットの型に頼らず、桁を 1 つ積む前に「積んだらあふれるか」を確かめる練習です。

海外で定番の問題リスト 4 本には入っていません

問題

32 ビットの符号つき整数しか持てない機器で、数の桁を逆に並べ替えます。整数 x を受け取り、10 進で書いた桁を逆順にした数を返す関数を書いてください。符号はそのまま残します。

  • 逆にした数の頭に来る 0 は消えます。-560 は -65 です
  • 逆にした数が、32 ビットの符号つき整数の範囲 (-2147483648 以上 2147483647 以下) を出るときは 0 を返します
  • x も同じ範囲の整数です
  • 途中の計算でも、この範囲を出る値を持たない書き方にしてください。64 ビットの整数の型に移して最後に範囲を確かめる書き方は使いません

入力と出力の例

例 1

x = 4071
1704

例 2

負の数は符号を残し、頭に来る 0 は消えます。

x = -560
-65

例 3

逆にすると 2147483651 になり、2147483647 を超えるので 0 です。

x = 1563847412
0

面接での聞かれ方

面接では、あふれの扱いを見る問題として出されます。

  • 「整数の桁を逆にしてください。32 ビットに収まらないなら 0 を返してください」
  • 64 ビットの型で計算してから範囲を確かめる書き方を見せると、「32 ビットの型しか無いとしたら?」と続きます
  • 「負の数で、余りの符号は言語によって違いませんか?」と聞かれることもあります

芯は、あふれた後ではなく、あふれる前に気づく書き方ができるかです。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def reverse_integer(x: int) -> int:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(reverse_integer(4071))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します