問題文
2 つの文字列 word1 と word2 が与えられます。 word1 から始めて交互に文字を追加して、文字列を結合します。ある文字列が他の文字列より長い場合は、マージされた文字列の末尾に追加の文字を追加します。
マージされた文字列を返します。
解き方 3つ
コード① StringBuilderを使用しない 実行速度:13ms メモリー:42.82MB
class Solution {
public String mergeAlternately(String word1, String word2) {
String ans ="";
int index=0;
while(index < word1.length()+word2.length() ){
if(index < word1.length()){
ans += word1.charAt(index);
}
if(index < word2.length()){
ans += word2.charAt(index);
}
index++;
}
return ans;
}
}
コード② StringBuilder使用する 実行速度:2ms メモリー:42.08MB
class Solution {
public String mergeAlternately(String word1, String word2) {
int index=0;
StringBuilder str = new StringBuilder();
while(index < word1.length()+word2.length() ){
if(index < word1.length()){
str.append(word1.charAt(index));
}
if(index < word2.length()){
str.append(word2.charAt(index));
}
index++;
}
return str.toString();
}
}
コード③ StringBuilderとMath.max,三項演算子を使用 実行速度:2ms メモリー:41.72MB
class Solution {
public String mergeAlternately(String word1, String word2) {
int index=0;
StringBuilder str = new StringBuilder();
int maxLength = Math.max(word1.length(),word2.length());
while(index < maxLength){
char w1 = (index < word1.length())? word1.charAt(index) : '\0';
char w2 = (index < word2.length())? word2.charAt(index) : '\0';
if(w1 != '\0'){
str.append(w1);
}
if(w2 != '\0'){
str.append(w2);
}
index++;
}
return str.toString();
}
}
結果
StringBuilderを使用するかしないかで実行時間が11ms減らすことができた
StringBuilderとString型の違い
String型は不変です。そのため+=で文字を追加した場合は、新しいString型のインスタンスが生成され、パフォーマンスがコード①のように低いものになります。一方で、StringBuilderは可変型です。文字を追加したとしても新しいインスタンスが生成されることはなく、String型のようにパフォーマンスを下げることはありません。
StringBuilderクラスには文字列から検索をかけるメソッドがないため、String型に変換する必要があります。また、変更数が少ない場合はパフォーマンスに違いがあまり見られないため、String型でも良いかもしれません。
このことから、StringBuilderを使用する場合は、文字列に対して多くの変更を行うことが予測される場合か文字列に不明な数の変更を加えると予想される場合。
参考