カウントダウン
数字は並んだ。でも最後にスペースが 1 つ残る
3 2 1 と並べるだけなら難しくありません。難しいのは、テストが待っているのが "3 2 1" であって "3 2 1 " ではない、というところです。区切り文字を足しながらつないでいくと、最後の要素のうしろにも必ず区切りが 1 つ余ります。この 1 文字でテストは落ちます。
1 ずつ減らすのは --
n--; は n = n - 1; の短縮形です。++ の兄弟で、単独の文として書くかぎり n-- と --n の動きは同じです。
Java
int stock = 3;
stock--; // stock は 2
stock--; // stock は 1while の中で 1 周ごとに n-- を通せば n は少しずつ小さくなり、いずれ条件が false になって抜けます。この行を書き忘れると n が動かず、無限ループです。
抜ける場所も声に出して読んでください。n がいくつのときに入って、いくつで抜けるのか。"3 2 1" に 0 が混ざってしまう事故は、ほぼすべてここの読み違いです。「1 のときは入る、0 になったら抜ける」と読み上げられる条件になっているか、手を止めて確かめましょう。
区切りが 1 つ余る
タグを , でつなぐ例で見てみます。
Java
String tags = "";
tags = tags + "java" + ",";
tags = tags + "loop" + ",";
// tags は "java,loop," ── 末尾の , が余る+ の左が String なら、右に int を置いても自動で文字列に変換されてつながります。数値をそのまま足せるのは便利ですが、区切りの数だけはいつも 1 つ多くなります。
対処は 2 通りあります。ひとつは後始末で、余分を最後にまとめて落とす方法です。trim() は文字列の両端の空白を取り除いてくれます。
Java
System.out.println(" 3 2 1 ".trim()); // "3 2 1"もうひとつは先頭判定で、2 個目以降の要素の前に区切りを置く方法です。1 個目のときだけ区切りを飛ばせば、そもそも余りません。どちらで書いても通ります。
やってみよう
Solution.countDown(int n) を完成させましょう。while で n を 1 ずつ減らしながら、その値を結果の文字列に足していきます。
順番にひとつ注意があります。結果に n を足す前に n-- を通してしまうと、最初の数字が抜けて "2 1" から始まってしまいます。減らすのは足したあとです。
書けたら 1 を渡してみてください。要素が 1 個だけのときに余計な空白が残っていないか、末尾の手当てを入れたかどうかがそのまま出る場所です。
要件
- クラス名は
Solution、メソッド名はcountDown、引数はint n1 つ、戻り値の型はString - 繰り返し処理には必ず
while文を使うこと (for文は使わない) - 戻り値は
nから1までを 半角スペース 1 つ区切り でつないだ文字列 (例:"3 2 1")。末尾に余計な空白を残さないこと
入出力例
countDown(3) → "3 2 1"
countDown(5) → "5 4 3 2 1"
countDown(1) → "1"
countDown(10) → "10 9 8 7 6 5 4 3 2 1"