JAVA22

 回文判定

早時問題なので、考え方としては簡単なのだが、自分が作成したものはやけに(早時も問題の割りに)冗長だったので、解いたあと少し調べるといろいろなやり方があって頭を柔らかくしなければな〜と感じている。

問題自体は、scannerで入力された文字列が回文かを判定してYES/NOで出力するというもの。

1. 最初に作ったコード

下記の通り、とっても冗長です。文字列が素材として出た時点でsubstringしか頭になく、そのまま素直に書いた。この時点で微妙に感じていたのは、centerが偶数と奇数で判定があるため、toCharArray()で配列に入れて値の両端から比較する方法も考えたが素直に書ききった。あとは特に問題はないがStringにcharを足していくこと、StringBuilderを使うべきか、どっちがいいのか、あまり変わらないのか調べたいと思っている。

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
int center = line.length() / 2;

String half = "";
String another_half = line.substring(center);
if(line.length()%2==0){
half = line.substring(0, center);
} else {
half = line.substring(0, center+1);
}

String reverse = "";
for(int i=half.length()-1; i>=0; i--){
reverse += half.charAt(i);
}
if(reverse.equals(another_half)) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}

2. その他の解法1 

charを一つ一つチェックするメソッドを呼び出してboolean値で返す。一回でも異なる場合、falseが返る。値に準じた出力を設定すればOK。1でちょっと考えたようなcharの配列を作らずともよく、charAt()で簡単に比較できる。スマート。

public static boolean checkCharOneByOne(String line) {
int min_Index = 0;
int max_Index = line.length() - 1;

while(min_Index < max_Index) {
if(line.charAt(min_Index++) != line.charAt(max_Index--)) {
return false;
}
}
return true;
}

3.  その他の解放2

StringBuilderにはreverseメソッドが存在する。

重要なのはtoStringでString型の比較にしてあげること。String型とStringBuilder型をequalメソッドで比較する場合、参照先の比較となるため100% falseになる。sb型の反転された文字列をtoStringメソッドでString型に直して比較することで純然たる文字列同士の比較になる。

public static boolean checkWholeSentenceAtOneTime(String line) {
StringBuilder sb =
new StringBuilder(line);
return line.equals(sb.reverse().toString());
}