悩んでいる人
- 「Reverse Integerの解法がよくわからない」
- 「英語の問題文、解答を読むのがめんどくさい」
そんな悩みに答えます。
この記事は、Leetcodeの#7 Reverse Integerを解説します。
もちろん日本語です。
僕自身、現役SEでもあり、TOEIC800オーバーなので、そこそこわかりやすいと思います。
目次
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]になります。
「よくわからん!」というあなたは、以下をご覧ください。わかりやすいです。
Reverse Integerの解答
有志の解答から、最も評価が高い解答を紹介します。
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項目です。
- if文
- OR演算子
- else文
- str関数
- スライシング
- 文字列の連結
- 階乗の演算子
どれもPythonの基本的な内容ですね。
詳細の説明はあえて省きますが、必要最低限は説明します。
Reverse Integerの解法
”**”←これなに?
if x >= 2**31-1 or x <= -2**31: return 0
冒頭にも出てきますが、階乗を表します。
例えば、2**3ならば、2を3回かけて8になります。
解答の内容は、32ビット符号付整数の範囲外なら、0を返します。
また、範囲を超えることをオーバーフローといいます。
xを文字列に変換
else:
strg = str(x)
else節で、オーバーフローしない時の処理をあらわしています。
まず、str関数で、数値xを文字列に変換します。
数値はそのまま逆順にできないからです。
文字列は次に説明する方法で、逆順にします。
スライシングで逆順に
if x >= 0 :
revst = strg[::-1]
if文で、xが0以上のときの処理に移ります。
ここで文字列を逆順にするために、スライシングが登場です。
スライシングは、始点:終点:ステップ数を指定します。
この時、始点・終点を省略し、ステップ数-1にすると、逆順になるのです。
xが負の整数の時
else:
temp = strg[1:]
temp2 = temp[::-1]
revst = "-" + temp2
xが負の整数なら、一番左にマイナスがついてますよね。
したがって、逆順にすると、一番右にマイナスが来ちゃいます。
そこで、またまたスライシングです。
まず、”-”の1個右の要素から取り出します。(始点に1を指定)
さらに、逆順に変換です。
さらにさらに、左辺に”-”をつけてあげることで、負の整数を保ったまま、逆順にできました。
逆順のオーバフロー
if int(revst) >= 2**31-1 or int(revst) <= -2**31: return 0
else: return int(revst)
最後に、再度オーバーフローのチェックです。
オーバーフローしていれば、返り値0を、していなければ逆順にした値を返します。
基本的な知識を組み合わせた良問
慣れていないと、とっつきにくいですが、
基本が身につく、非常にいい問題でしたね。
理解できない部分や、もうすこし詳しく知りたい部分があれば、
ぜひググってみてください。
では、次の問題で会いましょう。