かずとよのアウトプット日記

開発エンジニアを目指しています。

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

しかし、これでは不正解でした。

 

Input:1534236469
Output:9646324351
Expected:0

 

どうも、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。