LoginSignup
0
1

More than 5 years have passed since last update.

文字列のパズル

Last updated at Posted at 2018-03-10

頭の体操

コンソールに任意の文字列を入力したときに

YamadaTaro //input
a        r
m        a
a        T
d        a
a        d
T        a
a        m
r        a
oraTadamaY

以上のように表示されるコードを書く。

最終行の"oraTadamaY"は、StringクラスかStringBuilderクラスに文字列を逆順に返すreverseメソッド的なのがあったような気がします(うろ覚え)。これが使えます。

さて、残り中間部分。文字の間に空白が(文字列長-2)個挿入されるということです。
ということは、(文字列長-2)回for文で結合を繰り返した空白文字列群の両端に、charAt()で抜き出した文字を連結させればいいのです。

main.java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String a = s.nextLine();

        StringBuilder sb = new StringBuilder(a);
        StringBuilder blank = new StringBuilder();

        int len = a.length();
        for (int i = 0; i < len - 2; i++) {
            blank.append(" ");
        }
        for (int j = 1; j < len - 1; j++) {
            System.out.println(a.charAt(j) + blank.toString() + a.charAt(len - j - 1));
        }
        System.out.println(sb.reverse());
    }
}

本当はScan したStinrgの方のまま扱いたかったのですが、reverseメソッドを使う必要があったためStringをStringBuilderに変換しています。

for(;;)は見通しがすこしよくないので、あまり使いたくありません。それよりも拡張forかwhileを使いたいのですが、無駄なローカル変数が増えそうだったのでfor(;;)使います。

今考えてみると、文字配列(char[])とif文でも行けそうな気がしますね。その場合、行数長くなりそうです。

for (int j = 1; j < len - 1; j++) {
System.out.println(a.charAt(j) + blank.toString() + a.charAt(len - j - 1));
}

jの終値はlen-1なので、2-9行目の右端の文字のインデックスは{(len-1)-j}なのですね。上の(len - j - 1))よりもlen-1-jのほうが分かりやすいのかなーと思います。

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1