剑指Offer——面试题5替换空格

Note: 剑指offer的题可以在牛客网上做题验证思路的正确性

依赖StringBuffer的replace实现,时间复杂度O(n),空间复杂度较高

思路:因为StringBuffer本身是可变字符串序列,可以修改,实际上它的可变是牺牲空间换取的。替换可能导致超出其容量,char数组的复制和新建。

public String replaceSpace(StringBuffer str) {
        // 判断是否为空
        if(str == null){
            return null;
        }

        String originalStr = str.toString();
        String replacedStr = "%20";
        int increaseLen = 2;
        int spaceCount = 0;
        int strLen = originalStr.length();
        int index = 0;
        while(index < spaceCount*increaseLen + strLen){
            if(str.charAt(index) == ' '){
                str.replace(index, index+1, replacedStr);
                spaceCount++;
                index += 3;
            }else{
                index++;
            }
        }
        return str.toString();
    }

如果进一步缩小空间复杂度

思路:先统计空格数,得到新字符串长度,再复制和替换,避免空间的浪费

public String replaceSpace(StringBuffer str) {
        // 判断是否为空
        if(str == null){
            return null;
        }

        String originalStr = str.toString();
        int increaseLen = 2;
        int spaceCount = 0;
        int strLen = originalStr.length();
        // 统计空格数量
        for(int i = 0; i < strLen; i++){
            if(str.charAt(i) == ' '){
                spaceCount++;
            }
        }

        // 替换
        int newStrLen = spaceCount*increaseLen + strLen;
        char[] newCharSeq = new char[newStrLen];
        spaceCount = 0;
        for(int i = 0; i < newStrLen; ){
            int oindex = i-spaceCount*2; //原位置
            if(str.charAt(oindex) == ' '){
                newCharSeq[i++] = '%';
                newCharSeq[i++] = '2';
                newCharSeq[i++] = '0';
                spaceCount++;
            }else{
                newCharSeq[i] = str.charAt(oindex);
                i++;
            }
        }

        return new String(newCharSeq);
    }

你可能感兴趣的:(算法题)