LeetCode#2 Reverse Integer
Intで来る数字を逆転させる問題。123だったら321に。
-2の31から2の31乗-1まで許容してその範囲を超えると0を返す。
で書いたコードがこれ。
class Solution { func reverse(_ x: Int) -> Int { var num = x var res:Int = 0 var tmpArray: [Int] = [] let isNegative:Bool = num < 0 num = isNegative ? num * (-1) : num while num > 0 { tmpArray.append(num % 10) num = num / 10 } var i:Int = 1; tmpArray = tmpArray.reversed() for tmpNum in tmpArray { res = res &+ tmpNum * i i *= 10 } res = isNegative ? res * (-1) : res return res > Int32.max || res < Int32.min ? 0 : res } }
LeetCodeはアルゴリズムを教えてくれるのでそれをみながらコードを書き直してみる。
基本的には文字列の反転と同じように最後の桁をポップして結果の先頭にプッシュする処理を繰り返すことでできる。 オーバーフローのチェック方法は、(ポップした数字+今までの計算結果)/10がSwiftでいうInt32.maxと等しいかつ、ポップした数字が7を超えていれば正の数のオーバーフローになる。 らしいんだけど、今回の問題をSwiftで解く分には、Int型で計算してれば2の31乗でオーバーフローは起きないのでループの最後にチェックすれば良さそう
最終的にこうなった
class Solution { func reverse(_ x: Int) -> Int { var num:Int = x var res:Int = 0 while num != 0 { let pop:Int = num % 10 num = num / 10 res = res * 10 + pop if res > Int32.max || res < Int32.min { return 0 } } return res } }
Swiftの型についてはここを参考にした