【Leetcode】Reverse Integerの解説【基本の1問】

reverse integerのアイキャッチ画像

悩んでいる人

  • 「Reverse Integerの解法がよくわからない」
  • 「英語の問題文、解答を読むのがめんどくさい」

そんな悩みに答えます。

この記事は、Leetcodeの#7 Reverse Integerを解説します。
もちろん日本語です。

僕自身、現役SEでもあり、TOEIC800オーバーなので、そこそこわかりやすいと思います。

>>Leetcodeの使い方はこちら

Reverse Integerの問題文

Given a 32-bit signed integer, reverse digits of an integer.
(32ビットの符号付整数を、桁を逆順にした整数にしてください。)

補記:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1].
(32ビットの符号付整数しか扱えないものとします。範囲:[-(2の31乗)~(2の31乗)-1]

For the purpose of this problem,
(この問題のために、)

assume that your function returns 0 when the reversed integer overflows.
(逆順にした整数が範囲を超えたら、ゼロを返すものとします。)

32ビットの符号付整数とは?

1ビット=(2の1乗)としたとき、32ビットは2の32乗(=約42.9億)です。
(2の32乗)の範囲で、0と符号を含む整数を表したものが、32ビット符号付き整数です。

範囲であらわすと、[-(2の31乗)~(2の31乗)-1]になります。

「よくわからん!」というあなたは、以下をご覧ください。わかりやすいです。

>>32ビットの符号付整数の解説

Reverse Integerの解答

有志の解答から、最も評価が高い解答を紹介します。

Python
        if x >= 2**31-1 or x <= -2**31: return 0
        else:
            strg = str(x)
            if x >= 0 :
                revst = strg[::-1]
            else:
                temp = strg[1:] 
                temp2 = temp[::-1] 
                revst = "-" + temp2
            if int(revst) >= 2**31-1 or int(revst) <= -2**31: return 0
            else: return int(revst)

Reverse Integerの前提知識

Reverse Integerを解くにあたって必要なことは、以下の7項目です。

  1. if文
  2. OR演算子
  3. else文
  4. str関数
  5. スライシング
  6. 文字列の連結
  7. 階乗の演算子

どれもPythonの基本的な内容ですね。
詳細の説明はあえて省きますが、必要最低限は説明します。

Reverse Integerの解法

”**”←これなに?

Python
        if x >= 2**31-1 or x <= -2**31: return 0

冒頭にも出てきますが、階乗を表します。
例えば、2**3ならば、2を3回かけて8になります。

解答の内容は、32ビット符号付整数の範囲外なら、0を返します。
また、範囲を超えることをオーバーフローといいます。

xを文字列に変換

Python
        else:
            strg = str(x)

else節で、オーバーフローしない時の処理をあらわしています。

まず、str関数で、数値xを文字列に変換します。
数値はそのまま逆順にできないからです。

文字列は次に説明する方法で、逆順にします。

スライシングで逆順に

Python
            if x >= 0 :
                revst = strg[::-1]

if文で、xが0以上のときの処理に移ります。

ここで文字列を逆順にするために、スライシングが登場です。

スライシングは、始点:終点:ステップ数を指定します。
この時、始点・終点を省略し、ステップ数-1にすると、逆順になるのです。

xが負の整数の時

Python
            else:
                temp = strg[1:] 
                temp2 = temp[::-1] 
                revst = "-" + temp2

xが負の整数なら、一番左にマイナスがついてますよね。
したがって、逆順にすると、一番右にマイナスが来ちゃいます

そこで、またまたスライシングです。

まず、”-”の1個右の要素から取り出します。(始点に1を指定)
さらに、逆順に変換です。

さらにさらに、左辺に”-”をつけてあげることで、負の整数を保ったまま、逆順にできました。

逆順のオーバフロー

Python
            if int(revst) >= 2**31-1 or int(revst) <= -2**31: return 0
            else: return int(revst)

最後に、再度オーバーフローのチェックです。
オーバーフローしていれば、返り値0を、していなければ逆順にした値を返します。

基本的な知識を組み合わせた良問

慣れていないと、とっつきにくいですが、
基本が身につく、非常にいい問題でしたね。

理解できない部分や、もうすこし詳しく知りたい部分があれば、
ぜひググってみてください。

では、次の問題で会いましょう。