建志オファー05.スペースを置き換える
文字列sの各スペースを「%20」に置き換える関数を実装してください。
方法1:StingBufferを使用する
public static String replaceSpace(String s) {
//new StringBulider(速度快,线程不安全)或者StringBuffer填充
StringBuilder sb = new StringBuilder();
char[] arry = s.toCharArray();
for (int j = 0; j < arry.length; j++) {
if (arry[j] == ' ') {
sb.append("%20");
} else sb.append(arry[j]);
}
// 同String.valueOf(sb);
return sb.toString();
}
1.文字列型データを文字型配列に変換
します。2。StingBufferを使用して、変更可能な新しい配列を作成します。3
。配列を1つずつ走査し、スペースではない文字を直接挿入し、%20でスペースである文字を挿入します
。4。最後にデータを文字列型に変換する
方法2:APIを直接使用する
public static String replaceSpaceTwo(String s) {
String value = s.replaceAll(" ","%20");
return value;
}
replaceを使用すると単一の文字が変換されますが、replaceAllをreplaceに変更しても同じ結果が得られます。
方法3:逆の順序で挿入
1.最初に文字列をトラバースしてスペースの数を記録し、長さ+スペースの数* 2の文字を作成します。配列
2.文字列を後ろからトラバースします。3 .
文字がスペース以外の場合は、元の文字として挿入し、挿入位置の数に注意してください-1
3.文字がスペースの場合は、%20を1つずつ挿入し、各文字-1
public static String replaceSpaceThree(String s){
int count = 0;
int oldlen = s.length() - 1;
// 旧数组长度-1,表示最后一个数的下标
char[] sArry = s.toCharArray();
for(int i =0; i < s.length(); i++){
if(sArry[i] == ' '){
count ++;
}
}
char[] value = new char[(s.length() + count *2)];
// 新的数组长度-1,表示最后一个数的下标
int newlen = value.length-1;
for(int j = oldlen; j >= 0;j--){
if(sArry[j] == ' '){
value[newlen--] = '0';
value[newlen--] = '2';
value[newlen--] = '%';
}
else{
//--是先赋值后再-1
value[newlen--] = sArry[j];
}
}
return String.valueOf(value);
}
注:逆の順序で挿入するため、挿入位置の%20は02%になる必要があります
ブロガーの最初のアイデアは、後の順序で挿入することであり、後で新しい配列の長さが決定されたと考えたので、それを正の順序で挿入しませんか?配列を挿入するときに2つの変数を使用して添え字を制御している限り、それを実現できることがわかります。ブロガーは最初に添え字を使用して新しい配列の添え字+1と+2を制御しましたが、後続のシーケンスにスペースがない場合、jに割り当てられた添え字を特定することは困難です。ここで言うことはあまりありません!
方法4:ポジティブシーケンスの挿入
public static String replaceSpaceFour(String s){
int count = 0;
int oldlen = s.length() - 1;
// 旧数组长度-1,表示最后一个数的下标
char[] sArry = s.toCharArray();
for(int i =0; i < s.length(); i++){
if(sArry[i] == ' '){
count ++;
}
}
char[] value = new char[(s.length() + count *2)];
// 新的数组下标从0开始
int newlen = 0;
for(int j = 0; j <= oldlen;j++){
if(sArry[j] == ' '){
value[newlen++] = '%';
value[newlen++] = '2';
value[newlen++] = '0';
}
else{
//--是先赋值后再-1
value[newlen++] = sArry[j];
}
}
return String.valueOf(value);
}
これらの2つの方法の編成は、公式のJianzhiのオファーが次の方法であるため、多くの時間を浪費します。最初に、長さの3倍のスペースが開かれ、1つずつ挿入され、最後に使用された最初のサイズのビットが出力されます、個人的には最初の開発で多くのスペースを無駄に使った気がするので、上記の文章を考えていて、習得できる一例です!
方法5:剣はオファーを指します
class Solution {
public String replaceSpace(String s) {
int length = s.length();
char[] array = new char[length * 3];
int size = 0;
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
if (c == ' ') {
array[size++] = '%';
array[size++] = '2';
array[size++] = '0';
} else {
array[size++] = c;
}
}
String newStr = new String(array, 0, size);
return newStr;
}
}
実際、プロセス全体を観察すると、違いはありません。最初の配列の長さが違うだけです。