NinaLabo

個人ゲーム開発者の技術メモ

【LeetCode】9. Palindrome Number (Easy)

【最初に】

LeetCode 3個目に挑戦です

leetcode.com

 

 

 

【問題】

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

回文の整数(前から読んでも後ろから読んでも同じ数値になっている)かどうかを判定せよ。

Example 1:

Input: 121
Output: true

Example 2:

Input: -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.

Example 3:

Input: 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

 

【とりあえず】

数値を文字列にして前からと後ろからで比較してみる

f:id:ninagreen:20191107233351p:plain

 

できた!

f:id:ninagreen:20191107233439p:plain

 

【違うパターン】

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

問題の最後に、integerをstringに変換せずに解いてみない?とある。

うーん、これって前回やった数値を逆にするのを使えばいけるんじゃない?

ninagreen.hatenablog.com

 

ということで、やってみた。

f:id:ninagreen:20191107235432p:plain

 

マイナスの場合は判定するまでもなくfalse、オーバーフローの場合もfalseにしつつ、数値を逆に並び替える。最後に入力された数字と並び替えた数字を比較して同じかどうかを返す。

 

できた!

f:id:ninagreen:20191107235601p:plain

 

 

【解答をチラ見する】

解答は数値を半分だけ逆順にすれば、回文であれば残りの数字と同じになるよねという考え方のよう。例えば、1221であれば1桁目と2桁目の21を逆順にした12は、残りの3桁目と4桁目と同じになる。

 

f:id:ninagreen:20191108004646p:plain

最後の判定で10で割った値と比較しているのは、数字が奇数だった場合、例えば入力値が12321の場合、x=12、result=123になるのでこのままだとfalseになってしまうから。真ん中の値は何でもいいので、resultを10で割って12に無理やりしている。

また、最初に10で割り切れる数を除外しているのは、例えば入力値が10の場合、最終的にx <= resultにならないとwhileループを抜けないので、ループを抜ける頃には x=0、result=1 になっている。このままだと回文でないにも関わらず、奇数計算用の x == result / 10 で true になってしまうので事前に除外する必要がある。

 

全部並べ換えるよりループは半分で済むけど、なんかわかりにくいように思うのは私だけ...?

 

【最後に】

以前やった問題とほぼ同じ問題かと思ったけど、そんなの出ないよね。