04.スペースの置き換え---『剣指Offer』(Java版)

4279 ワード

『剣指Offer』(Java言語版解答)githubリンク:
これを注文する
1つの文字列の各スペースを「%20」に置き換える関数を実装してください.例えば、文字列がWe Are Happyである.置換後の文字列は、We%20 Are%20 Happyである.
Java言語にあまり詳しくない学生はStringを使うかもしれませんが、Stringは可変ではないため、+-操作を行うたびにStringが新しく生成され、空間と時間の二重の浪費をもたらします.Javaはこの場合StringBuilderクラスを使用してappend()操作を継続することを提案する.
public String replaceSpace(StringBuffer str) {
        if(str == null){
            return null;
        }
        //   char[],        ,  []  charAt     
        char[] s = str.toString().toCharArray();
        StringBuffer res = new StringBuffer();
        //      forEach,  foreach     ,               。
        for (int i = 0; i < s.length; i++) {
            if(s[i] == ' '){
                res.append("%20");
            }else {
                res.append(s[i]);
            }
        }
        return res.toString();
    }

C/C++については考慮すべきことが多いが、Javaは造ったホイールStringBuilderをそのまま使えばよい.
しかし、作者はchar配列を意味していたので、私もchar配列を使ってみました.
public String replaceSpaceByCharArr(String str) {
        if (str == null) {
            return null;
        }
        char[] s = str.toCharArray();
        //            ,         +count(' ')*2  
        int countSpace = count(s, ' ');
        //    
        char[] resArr = new char[s.length + 2 * countSpace];
        for (int i = 0, j = 0; i < s.length; i++, j++) {
            if (s[i] == ' ') {
                resArr[j++] = '%';
                resArr[j++] = '2';
                resArr[j] = '0';
            } else {
                resArr[j] = s[i];
            }
        }
        //  Char    String
        return new String(resArr);
    }

    /**
     *    char   ,target     
     */
    private int count(char[] s, char target) {
        int res = 0;
        for (char c : s) {
            if (target == c) {
                res++;
            }
        }
        return res;
    }

すべてのコードは次のとおりです.
/**
 *        :
 *                “%20”。
 *   
 * 

* We Are Happy. * We%20Are%20Happy。 */ public class _004_replaceSpace { /** * , String, 。 * String ,"+" String , 。 * :"Login" + "Username" ---> 3 String, "Login","Username","LoginUsername" * . *

* , * :StringBuilder; * :StringBuffer */ public String replaceSpaceByStringBuilder(String str) { if (str == null) { return null; } // char[],char[] , char[] , // char[] s = str.toCharArray(); StringBuffer res = new StringBuffer(); // foreach 。 for (char c : s) { // , res "%20", String str+="%20" 。 if (c == ' ') { res.append("%20"); } else { // , res.append(c); } } // StringBuilder String, return res.toString(); } /** * Offer char[], 。 *

* , . */ public String replaceSpaceByCharArr(String str) { if (str == null) { return null; } char[] s = str.toCharArray(); // , +count(' ')*2 int countSpace = count(s, ' '); // char[] resArr = new char[s.length + 2 * countSpace]; for (int i = 0, j = 0; i < s.length; i++, j++) { if (s[i] == ' ') { resArr[j++] = '%'; resArr[j++] = '2'; resArr[j] = '0'; } else { resArr[j] = s[i]; } } // Char String return new String(resArr); } /** * char ,target */ private int count(char[] s, char target) { int res = 0; for (char c : s) { if (target == c) { res++; } } return res; } }