【LeetCode】Easy: Palindrome Number

Palindrome Number

https://leetcode.com/problems/palindrome-number/

自分の回答

class Solution {
    func isPalindrome(_ x: Int) -> Bool {
        var string = String(x)
        while string.count != 0 {
            if string.removeFirst() != string.popLast() {
                return false
            }
        }
        return true
    }
}

while の条件間違えてて、ずっとtrue 🤷

修正

class Solution {
    func isPalindrome(_ x: Int) -> Bool {
        var string = String(x)
        while string.count > 1 {
            if string.removeFirst() != string.popLast() {
                return false
            }
        }
        return true
    }
}

f:id:hira22_1:20200605074858p:plain

回答

https://leetcode.com/problems/palindrome-number/solution/

Follow up

Coud you solve it without converting the integer to a string?

見落としてた。

説明

  • String に変換するのは、問題で禁止されている。
  • 逆数を作ると、オーバーフローする可能性がある。
  • 回文であれば、半分に分けるともう半分の反転と一致する。
    • 1221 を 12(a) と 21(b) に分ける。
    • b を反転させて 12 にすると a と一致する。

アルゴリズム

  • 負数は回文になり得ない。一の位が 0 も回文になり得ない。
  • 最後の一桁を取得するには % 10 -> x
  • 次の一桁を取得するために / 10 -> y
  • x * 10 + y で反転。

半分になったことをどうやって知るか

  • 元の数字は桁が減っている。
  • 反転した数字は桁が増えている。
  • 元の数字 < 反転した数字 となったら、半分になっている。

回答を見て修正

class  Solution {
    func isPalindrome(_ x: Int) -> Bool {
        if x < 0 || (x % 10 == 0 && x != 0) { return false }
        var x: Int = x
        var reverted: Int = 0
        
        while x > reverted {
            reverted = reverted * 10 + x % 10
            x = x / 10
        }
        
        return x == reverted || x == reverted/10
    }
}

ちなみに…

class Solution {
    func isPalindrome(_ x: Int) -> Bool {
        let string = String(x)
        return string == String(string.reversed())
    }
}

f:id:hira22_1:20200605075751p:plain

感想

  • 回答例を見て、あーたしかに reverse ってあるな。と思った。