replace を置き換える文字列コンテンツ置換メソッドを手動で実装します。

序文

文字列置換の場合、replaceメソッドとreplaceAllメソッドは最も一般的に使用される解決策ですが、文字列置換を手動で処理するように求められたらどうしますか?

《剑指Offer》その05题1 つがこれです。

ここに画像の説明を挿入
このメソッドを使用する場合、replace処理するコードは 1 行です

class Solution {
    
    
    public String replaceSpace(String s) {
    
    
        return s.replace(" ","%20");
    }
}

自分で実装するとしたら、次のようになります代码如下

class Solution {
    
    
    public String replaceSpace(String s) {
    
    
        byte[] cs = s.getBytes();
        byte[] addByte = "%20".getBytes();
        int addIndex = 0;
        for (int i = 0; i < cs.length; i++) {
    
    
            if (cs[i] == 32){
    
    
                addIndex = addIndex + (addByte.length-1);
            }
        }

        char[] c = new char[cs.length+addIndex];
        int f = 0;
        for (int i = 0; i < c.length; i++) {
    
    
            if (cs[f] == 32){
    
    
                for (int j = 0; j < addByte.length; j++) {
    
    
                    c[i+j] = (char) addByte[j];
                }
                i = i+(addByte.length-1);
            }else{
    
    
                c[i] = (char) cs[f];
            }
            f++;
        }
        return new String(c);
    }
}

結果:

ここに画像の説明を挿入

分析する

上記のコードは複雑さの点であまり最適化されていません. あくまで最初の検討でそれを実現する方法にすぎません. 次に、文字列を置換するアイデアを分析してみましょう。

まず、文字列は文字配列で構成されます。つまりchar[]、文字列を“We are happy.”例にとると、その構造は次のようになります。
ここに画像の説明を挿入

文字列中にスペースを含む文字があり13、スペースはスペース文字を置き換える配列の長さを増やす必要があることcharを意味します。1 文字が 3 文字になる場合は、元の文字に 2 文字を追加する必要がありますlength. 2 つのスペースが 4 つである場合、構造は次のようになります。32%20charchar数组

ここに画像の説明を挿入

したがって、計算する必要がある 4 つの長さは次のとおりです。

  1. 元の文字列の長さ
  2. 置換文字列の長さ
  3. 置換された文字列の長さ
  4. 新しい文字列の長さ

最初の 3 つは直接取得できますが、4 番目は計算する必要があります。計算式は次のとおりです。

原始字符串长度 + (被替换字符串长度 - 替换字符串长度) * 替换字符串数量

上記の文字列を使用して数式を計算します。13 + (3 - 1) * 2 = 17結果は17上の画像の長さと一致します。

コード

置換文字列はスペースであることがわかっているため、固定1ビット文字であるため、上記 4 つの長さのうち 3 つを取得でき、置換文字の桁数も 1 回計算する必要があります。

コードは以下のように表示されます。

    public String replaceSpace(String s) {
    
    
        // 获取原始字符串长度
        byte[] sb = s.getBytes();
        // 获取替换字符串长度
        byte[] addByte = "%20".getBytes();
        // 计算被替换字符串出现次数
        int addIndex = 0;
        for (int i = 0; i < sb.length; i++) {
    
    
            if (sb[i] == 32){
    
    
                addIndex++;
            }
        }
        // 计算新字符串长度
        char[] c = new char[sb.length+(addByte.length-1)*addIndex];
    }

これら 4 つの値が取得された後、新しい文字列配列の内容を埋めることになります。これには、カウント原始字符串遍历位数レコードが必要です新字符串置換文字列が見つかった場合遍历位数+ それ以外の場合は、置換文字列が見つかった場合は+です新字符串长度>旧字符串长度新字符串遍历位数(被替换字符串长度 - 替换字符串长度) 新字符串长度<旧字符串长度旧字符串遍历位数(被替换字符串长度 - 替换字符串长度)

%20 > ''新しい文字列 + の走査桁は次のとおりです(被替换字符串长度 - 替换字符串长度) 。コードは次のとおりです。

    public String replaceSpace(String s) {
    
    
        // 获取原始字符串长度
        byte[] sb = s.getBytes();
        // 获取替换字符串长度
        byte[] addByte = "%20".getBytes();
        // 计算被替换字符串出现次数
        int addIndex = 0;
        for (int i = 0; i < sb.length; i++) {
    
    
            if (sb[i] == 32){
    
    
                addIndex++;
            }
        }
        // 计算新字符串长度
        char[] c = new char[sb.length+(addByte.length-1)*addIndex];

        // 记录旧字符串遍历位数
        int f = 0;
        // 循环新字符串
        for (int i = 0; i < c.length; i++) {
    
    
            if (sb[f] == 32){
    
    
                for (int j = 0; j < addByte.length; j++) {
    
    
                    c[i+j] = (char) addByte[j];
                }
                // 遇到替换字符串新字符遍历位数跳过(被替换字符串长度 - 替换字符串长度) 
                i = i+(addByte.length-1);
            }else{
    
    
                c[i] = (char) sb[f];
            }
            f++;
        }
        return new String(c);
    }

上式に従い、1空文字列条件を32置換後の文字列の長さで置換判定し、char值複数の文字列や標準文字列を使用することができます。

おすすめ

転載: blog.csdn.net/AnNanDu/article/details/126829679