【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 } }
回答
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()) } }
感想
- 回答例を見て、あーたしかに reverse ってあるな。と思った。