ずっと5月

3日坊主してます

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の型についてはここを参考にした

fukatsu.tech