引数で指定した数だけ草を生やして文字列として返す関数 kusa を作成する
以下のコードをもっと素直に書く方法としてはどんなものがあるのか知りたいです
よろしくお願いします
Java
1public class W_Unavoidable { 2 public static void main(String[] args) { 3 String w = kusa(50); 4 System.out.println(w); 5 } 6 public static String kusa(int num){ 7 String grass = ""; 8 for(; num > 0; num--){ 9 grass = grass + "w"; 10 } 11 return grass; 12 }
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
java
1public class Main { 2 public static void main(String[] args) throws Exception { 3 System.out.println(kusa(50)); 4 } 5 6 public static String kusa(int n){ 7 if (n < 1) return ""; 8 return "w" + kusa(--n); 9 } 10}
計算量やメモリやスタックのことなんかは知りません。
コードが美しければよいのですw
投稿2017/05/10 11:24
総合スコア2883
0
ベストアンサー
標準ライブラリだけでの実装を6個ほど考えました。
Java
1/** StringBuilder版 2 * 高速なStringBuliderに対して文字を追加する。 3 * 初期のキャパシティをnumにしておくと良いような気がする。 4 */ 5public static String kusa1(int num){ 6 StringBuilder grass = new StringBuilder(num); 7 for (int i = 0; i < num; i++) { 8 grass.append("w"); 9 } 10 return grass.toString(); 11} 12 13/** StringBuilder + 2倍しながら追加版 14 * 高速なStringBuliderに追加する。 15 * 2倍しながら追加していくので、O(n)=>O(log n)になるはず。 16 */ 17public static String kusa2(int num){ 18 StringBuilder grass = new StringBuilder(num); 19 String w = "w"; 20 while (num > 0) { 21 if ((num & 1) == 1) { 22 grass.append(w); 23 } 24 w += w; 25 num >>= 1; 26 } 27 return grass.toString(); 28} 29 30/** char[]版 31 * charの配列で作ってからStringにする。 32 */ 33public static String kusa3(int num){ 34 char[] grass = new char[num]; 35 for (int i = 0; i < num; i++) { 36 grass[i] = 'w'; 37 } 38 return new String(grass); 39} 40 41/** char[] + Arrays.fill版 42* charの配列で作ってからStringにする。 43 * Arrays.fillで埋める。 44 */ 45public static String kusa4(int num){ 46 char[] grass = new char[num]; 47 java.util.Arrays.fill(grass, 'w'); 48 return new String(grass); 49} 50 51/** IntStream版 52 * なんとなくIntSteramを使いたかっただけ。 53 */ 54public static String kusa5(int num){ 55 StringBuilder grass = new StringBuilder(num); 56 java.util.stream.IntStream.range(0, num).forEach((i) -> { 57 grass.append("w"); 58 }); 59 return grass.toString(); 60} 61 62/** IntStream + collect版 63 * なんとなくIntSteramを使いたかっただけ、その2。 64 * collectを使ってみたけど、面倒。parallelにすると壊れそう。 65 */ 66public static String kusa6(int num){ 67 return java.util.stream.IntStream.range(0, num).collect( 68 () -> new StringBuilder(), 69 (grass, i) -> grass.append("w"), 70 (a, b) -> a.append(b.toString()) 71 ).toString(); 72}
Stringに+
するよりStringBuiderにappend()
した方が高速です。kusa1
にするだけでもかなり違うと思います。StringBuilder.appendが定量計算時間なら、kusa2
が一番速くなりそうですが、kusa4
あたりが最速のような気がします。二文字以上だとkusa3
とkusa4
は使えませんが、一番素直なやり方かかも知れません。kusa5
とkusa6
は、まぁ、IntStreamを使いたかっただけかと。
投稿2017/05/10 10:49
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/10 12:34
退会済みユーザー
2017/05/10 12:54
2017/05/10 18:19
0
java
1public class W_Unavoidable { 2 public static void main(String[] args) { 3 kusa(50); 4 } 5 public static void kusa(int num){ 6 for(int i = 0;i<num ; i++){ 7 System.out.print("w"); 8 } 9 } 10}
あえてforを使っていくスタイル マイナスが素直じゃない感じなので。
投稿2017/05/10 09:10
総合スコア2050
0
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html
のStringUtilsを使ってよいのならすごいスッキリかけます。
java
1public static String kusa(int num){ 2 return StringUtils.repeat("w", num); 3}
投稿2017/05/10 08:58
総合スコア880
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。