leetcode : reverse integer
こんにちは。かずとよです。
今回は、reverse integerという問題のアウトプットです。
例の如く、英語の問題文が以下。
Given a signed 32-bit integer x
, return x
with its digits reversed. If reversing x
causes the value to go outside the signed 32-bit integer range [-231, 231 - 1]
, then return 0
.
Assume the environment does not allow you to store 64-bit integers (signed or unsigned).
Example 1:
Input: x = 123 Output: 321
Example 2:
Input: x = -123 Output: -321
Example 3:
Input: x = 120 Output: 21
Example 4:
Input: x = 0 Output: 0
Constraints:
-231 <= x <= 231 - 1
もちろん分からないので、翻訳しつつ解釈。
【xに渡した数字を反転させる。123なら、321というように。
ただし、xが32ビット整数の範囲を超えていた場合、0と出力させる。】
こんな感じだと思います。
・・・32ビット整数?なんじゃそりゃ?
まぁ、よくわからんけどとりあえずやってみよう。
以下、とりあえず試行錯誤した結果
# @param {Integer} x # @return {Integer} def reverse(x) if x >= 1 # xが1以上なら(正の数なら) x_s = x.to_s.reverse # 一旦ひっくり返せる様に文字列に変換して、reverse return x_s.to_i # 数値に戻して返す elsif x <= -1 # xが-1以下なら(負の数なら) x_s = x.to_s.reverse # ここは正の数字と同じ answer = (x_s.to_i) - (x_s.to_i * 2) # 上の反転処理の時に-が消えてしまったので、再度負の数にして、変数に代入 return answer else # 残るは0だけなので return 0 end end
しかし、これでは不正解でした。
どうも、0を求めてるらしい。反転できてるのに・・・なんでだ?
考えてると、頭の隅っこで32ビット整数が存在をアピールしてきました。
やっぱり、32ビット整数をしっかり考えないといけないのかな・・・
ということで、調べました。
【32ビットに格納できる符号なし整数の範囲は、0 から 4,294,967,295 である。
符号付き整数は −2,147,483,648 から 2,147,483,647 を格納できる。】
とのことでした。
今回の例文をみていると、例文2に-123は-321とあります。
なので、今回意識しないといけないのは、さっき調べたものの符号付き整数の方。
確かに、不正解の時のoutputをみると、2,147,483,647を超えています。
なるほど、そうなるときは、0と返さないといけないのか・・・
そして、再度試行錯誤の末・・・
# @param {Integer} x # @return {Integer} def reverse(x) if x >= 1 # xが1以上なら(正の数なら) x_s = x.to_s.reverse # 一旦ひっくり返せる様に文字列に変換して、reverse x_plus = x_s.to_i # 数値に戻す if x_plus >= 2147483648 # ここで再度条件分岐。さっき定義した変数が32ビット整数以上なら return 0 else return x_plus end elsif x <= -1 # xが-1以下なら(負の数なら) x_s = x.to_s.reverse # ここは正の数字と同じ x_minus = (x_s.to_i) - (x_s.to_i * 2) # 上の反転処理の時に-が消えてしまったので、再度負の数に。 if x_minus <= -2147483648 # x_minusが32ビット整数の範囲を超えていたらという条件で。 return 0 else return x_minus end else # 残るは0だけなので return 0 end end
これで、なんとかクリアでした。
いやいや、マジで難しすぎるよ、これ。
現役エンジニアの方々は、こんなの余裕で解けるの?やばくね?って感じました。
*今回の学び:
- .reverseで【文字列】を反転させる事ができる。(数値は不可)
- 文字列へ変換すると、-は消え去る
- 32ビット整数とは、32ビットに格納できる整数の範囲のこと。
そもそも、2進数で表現されるので、32ビットに格納できる整数の範囲は、0〜2の32乗-1となる。
16ビットは16乗、8ビットは8乗という様な感じらしい。 - よって、32ビット整数とは、符号なしの場合、0から4,294,967,295。
符号付き整数は、 −2,147,483,648 から 2,147,483,647。