【Python】回文数かを調べる(Palindrome Number)【LeetCode】
LeetCodeの問題に回文数かどうかを調べる問題があったので解いてみた。
回文数とは12321のように後ろから読んでも同じ値になるような数のこと。
入力値を文字列として考える
数値のままではどうか確かめにくいので、文字列に変換して考えてみる。
以下のコードで入力xを文字列に変換。
char_x = str(x)
次に、その文字列の長さが偶数であるか奇数であるかを調べる。
先頭から順に調べていってそれぞれ対照の位置にある文字と比較するときに、どこまで調べるかが文字列の長さによって変わる。
例えば、長さが4だったら、半分の2個めまでを調べるし、長さが5だったら、真ん中の3個目までを調べる。(よくよく考えると、3個めは調べる必要ないな笑)
if len(char_x)%2 == 0:
half_length = len(char_x)/2
else:
half_length = int(len(char_x)/2) + 1 #これは別に必要なく、この場合でもint(len(char_x))/2で良い笑
そして、実際に回文数かどうかをfor文で調べる。
for i in range(half_length):
if char_x[i] != char_x[len(char_x)-1-i]:
return False
return True
調べている途中で、合致しない文字があればその時点で調べるのを中止してFalseを返す。
まとめるとこんな感じ。
def isPalindrome(self, x):
char_x = str(x)
if len(char_x)%2 == 0:
half_length = len(char_x)/2
else:
half_length = int(len(char_x)/2) + 1
for i in range(half_length):
if char_x[i] != char_x[len(char_x)-1-i]:
return False
return True
実は1行で書けてしまう…
↑では複数行かけてコードを作成したけれども、実は1行で書けることがわかった笑。
そのコードは↓
return False if x < 0 else str(x) == str(x)[::-1]
なんとこれだけでできてしまう。
False if x < 0
これは、xが負ならマイナス(-)がつくので、その時点で回文数ではないということ。
else str(x) == str(x)[::-1]
ここでは、xが0以上のときに、文字列xとxの並びを反転させた文字列x’が等しいかどうかを調べている。
こんなに簡潔に書けるんだね。