JAva置換スペース


スペースの置換
タイトル:
1つの文字列の各スペースを「%20」に置き換える関数を実装してください.例えば、文字列がWe Are Happyである場合、置換後の文字列はWe%20 Are%20 Happyとなる.
  • 本の本意は、o(n)の複雑さを達成するために文字を後ろから前に移動させることであり、StringBufferの出現は、元の文字列の上で修正することを意味する.StringBufferとStringBuilderの方法を熟知してこそ、すばやく書くことができます.ここで注意すべき点はstrの長さを修正することです.
  • の間に書いたときに間違いを犯し、whileループをそこにi-を2つのcharAt()に書いて境界を越えた.
  • public class Solution {
        public String replaceSpace(StringBuffer str) {
        	if (str == null) return str.toString();
            int oldLen = str.length();
            int numOfBlank = 0;
            for (int i = 0; i < oldLen; ++i) {
                if (str.charAt(i) == ' ') {
                    ++numOfBlank;
                }
            }
            if (numOfBlank == 0) return str.toString();
            
            int newLen = oldLen + numOfBlank*2;
            str.setLength(newLen);
            int i = oldLen - 1;
            int j = newLen - 1;
            while (i >= 0) {
                if (str.charAt(i) == ' ') {
                    str.setCharAt(j--, '0');
                    str.setCharAt(j--, '2');
                    str.setCharAt(j--, '%');
                } else {
                    str.setCharAt(j--, str.charAt(i));
                }
                --i;
            }
            return str.toString();
        }
    }
    
  • ここのコードは簡単ですが、冗長になるに違いありません.出題者の本意でもないに違いありません.このように書くと面接に合格できないはずです.しかし、その原理も見なければならない.そこでここで使用しているreplaceソースコードをめくってみました.
  • public class Solution {
        public String replaceSpace(StringBuffer str) {
        	return str.toString().replace(" ", "%20");
        }
    }
    

    ソース分析:ここでStringBuilderを使用して新しいオブジェクトを最初からコピーし、総じて時間が上より少し遅くなり、スペースが多くなりました.
    public String replace(CharSequence target, CharSequence replacement) {
            String tgtStr = target.toString();
            String replStr = replacement.toString();
            int j = indexOf(tgtStr);
            if (j < 0) {
                return this;
            }
            int tgtLen = tgtStr.length();
            int tgtLen1 = Math.max(tgtLen, 1);
            int thisLen = length();
    
            int newLenHint = thisLen - tgtLen + replStr.length();
            if (newLenHint < 0) {
                throw new OutOfMemoryError();
            }
            StringBuilder sb = new StringBuilder(newLenHint);
            int i = 0;
            do {
                sb.append(this, i, j).append(replStr);
                i = j + tgtLen;
            } while (j < thisLen && (j = indexOf(tgtStr, j + tgtLen1)) > 0);
            return sb.append(this, i, thisLen).toString();
        }