はじめに
LeetCode の問題「Palindrome Number(回文数)」は、初心者にとってとても良い練習問題です。
この記事では、Java を使ってこの問題を解く方法を、初心者でもわかりやすく解説していきます。
- 回文数って何?
- どうやってプログラムで判断するの?
- 効率の良い方法ってあるの?
といった疑問に、実際のコードを交えながら答えていきます!
問題の説明
LeetCodeより、問題は以下のように出題されます。
整数
x
が与えられたとき、それが回文であるかを判定せよ。
回文とは、前から読んでも後ろから読んでも同じ数のこと。
例:
- 入力:
x = 121
→ 反転:121
→ 出力:true
- 入力:
x = -121
→ 反転:121
- → 出力:false
- 入力:
x = 10
→ 反転:01
→ 出力:false
自分の解き方(文字列に変えてひっくりかえす)
初心者としてまず思いついた方法は、数値を文字列に変換して、それを反転して比較する方法です。
Javaコード:
public class Solution {
public boolean isPalindrome(int x) {
String original = String.valueOf(x);
String reversed = new StringBuilder(original).reverse().toString();
return original.equals(reversed);
}
}
解説:
String.valueOf(x)
:整数を文字列に変換StringBuilder().reverse()
:文字列を逆順にequals()
:元の文字列と逆にした文字列を比較
ポイント:
- ✔️ 初心者にはとても分かりやすい
- ❌ ただし処理効率はそこまで良くない(文字列操作が入るため)
効率の良い解き方(半分までひっくり返す)
より効率的な方法は、「数値の後半部分だけを逆にして前半と比べる」という考え方です。
Javaコード:
public class Solution {
public boolean isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int reversedHalf = 0;
while (x > reversedHalf) {
reversedHalf = reversedHalf * 10 + x % 10;
x /= 10;
}
return (x == reversedHalf || x == reversedHalf / 10);
}
}
解説
x < 0
:マイナスの数は回文にならないx % 10 == 0 && x != 0
:末尾0の数も回文にはなれない(010はNG)while
文で、数値の後半だけを反転して比較対象に- 桁数が奇数の場合は真ん中の数字を除外して比較(
reversedHalf / 10
)
この方法のメリット:
- ✔️ 数値のままで処理するため高速
- ✔️ 文字列に変換しないのでメモリ効率も良い
- ✔️ インタビューなどでも高評価される方法
最後に
今回は LeetCode の「Palindrome Number(回文数)」という問題を、Java を使って初心者向けにわかりやすく解説しました。
「数値のまま半分だけひっくり返す」方法が効率がいいのでぜひチャレンジしてみてください。
この問題を通じて、ロジックの発想力とコードの読みやすさ・効率の違いを実感できるはずです!