回答編集履歴

2

k = 0, の削除。コメントに対する回答を追加

2020/09/11 02:44

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
  String t = "0387256789";
78
78
 
79
- for (int k = 0, i = 0; i < n; i++)
79
+ for (int i = 0; i < n; i++)
80
80
 
81
81
  out[i] = t.charAt(in.charAt(i) - '0');
82
82
 
@@ -95,3 +95,47 @@
95
95
  }
96
96
 
97
97
  ```
98
+
99
+ **追記2**
100
+
101
+ for文に、無意味な `k = 0, ` が入っていたのに気付きませんでしたか?
102
+
103
+ 削除しました。
104
+
105
+
106
+
107
+ out[i] = '3'; は、単なる代入です。
108
+
109
+
110
+
111
+ sb.append('3'); は、StringBuilderクラスのインスタンス sb についての
112
+
113
+ appendメソッドの呼び出しです。sb や '3' を引数として渡す作業が入ります。
114
+
115
+ StringBuilder sb は内部にバッファを持っていて、今回の append でそれが
116
+
117
+ バッファオーバーフローしないかどうかチェックしてから '3' をバッファに入れます。
118
+
119
+ その後、this すなわち sb を返すという作業も必要です。
120
+
121
+
122
+
123
+ StringBuilder を使うほうが効率が悪いのは明白です。
124
+
125
+
126
+
127
+ String t = "0387256789"; ですが、"0123456789" と比べてみてください。
128
+
129
+ '1' → '3'
130
+
131
+ '2' → '8'
132
+
133
+ '3' → '7'
134
+
135
+ '4' → '2'
136
+
137
+ '5' → '5'
138
+
139
+ という対応になっています。
140
+
141
+ 入力文字列の i番目の文字 in.charAt(i) に対応する文字への変換表です。

1

コードを追加

2020/09/11 02:44

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -47,3 +47,51 @@
47
47
  7 5 2 8 3
48
48
 
49
49
  ```
50
+
51
+ **追記**
52
+
53
+ > 最終的にはSystem.out.printlnで75283を表示させたい。
54
+
55
+
56
+
57
+ こう書いてあったので、数字の間にスペースが要るのかと思ったら、
58
+
59
+ 全角数字で書いてあるからそう見えただけのようでした。
60
+
61
+
62
+
63
+ + で文字列を連結したり、StringBuilder を使うよりも char の配列を
64
+
65
+ 使ったほうが効率が良いと思って書き直してみました。
66
+
67
+ ```Java
68
+
69
+ class Test {
70
+
71
+ public static String Num(String in) {
72
+
73
+ int n = in.length();
74
+
75
+ char[] out = new char[n];
76
+
77
+ String t = "0387256789";
78
+
79
+ for (int k = 0, i = 0; i < n; i++)
80
+
81
+ out[i] = t.charAt(in.charAt(i) - '0');
82
+
83
+ return String.valueOf(out);
84
+
85
+ }
86
+
87
+
88
+
89
+ public static void main(String[] args) {
90
+
91
+ System.out.println(Num("35421"));
92
+
93
+ }
94
+
95
+ }
96
+
97
+ ```