Sword Finger Offer 05.スペースを置き換える5つの方法

建志オファー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;
    }
}

実際、プロセス全体を観察すると、違いはありません。最初の配列の長さが違うだけです。

おすすめ

転載: blog.csdn.net/weixin_46801232/article/details/108692915