【LeetCode #9】Palindrome Numberの所見ログ
はじめに
一週間ぶりです。
今回はLeetCode#9のPalindrome Numberに取り組んだので、そのレポを残します。
どうでもいいけど、"Palindrome"ってなじみがなさ過ぎてスペル間違えそうになるね。
ではいきましょう。
問題概要
LeetCode 9: Palindrome Number
問題:
整数 x が与えられる。これが回文数(前から読んでも後ろから読んでも同じ)であるかを判定せよ。
例:
-
121 → True(121 == 121)
-
121 → False(負数は回文じゃない。"-121" != "121-")
-
10 → False(10 != 01)
初見の思考
問題を見て最初に思ったこと:
- 相変わらずなんもわからん。
- 配列に数字を一個ずつ取り出して、どっかで比較するのかな。
- (GPTからのヒント開示時)桁数が奇数なら中央、偶数なら折り返しで比較かな?
- 新しい変数に元の数の%10で求めた値を格納していく?
- 条件でふるいにかけたのをループして、任意の桁数まで終わらせて比較処理をする?
- 例外処理として、負数と一桁目が0の時(0単体は除く)はとりあえず弾いて良い。
自分で書いたコード(初版):
int reversed = 0;
if (x > 0 || (x % 10 == 0 && x != 0)) {
while (x < reversed) {
int n = x % 10;
x / 10;
reversed = reversed * 10 + n;
}
}
とりあえずGPTのヒントをもとに頑張って書いた、みたいな感じだね。
これの問題点は、最初の思考で、弾く時の条件がループに突入するための条件になってしまっていること。
あとはループの制御式も逆だね。 x > reversedにしないと、一生ループに入らないよ。
当時の僕。大丈夫そ?
あと見落としてたけど、xを10で割って、その変数どこにも入ってない。
アホかお前
x = x / 10;にしないとね。
あとはreturnが欲しいね。
## 正しくはこう。(GPT先生)
public boolean isPalindrome(int x) {
// 例外処理:負数 or 末尾が0(ただし0はOK)
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int reversed = 0;
while (x > reversed) {
int n = x % 10;
x /= 10;
reversed = reversed * 10 + n;
}
// 偶数桁なら x == reversed、奇数桁なら x == reversed / 10
return x == reversed || x == reversed / 10;
}
安定の綺麗さ。
例外処理を先にやって、returnに式を使うのが無駄がなくていい感じ。
これを自分で作れるようになりたいね。
学び
- 例外処理は先にやる。
- 回文の判定は折り返しまでやれば十分。
- ↑の条件はx <= reversedになった時。
- booleanで条件式を使うと綺麗に戻り値を返す。
おわりに
今回の問題は大部分をGPTに助けてもらった感じでした。
とはいえ、着々と前進してきているような気もする。
この調子で引き続き、Leetcodeに取り組んでいきます。