剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成”%20″。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例 1:

输入:s = “We are happy.”
输出:”We%20are%20happy.”

限制:

0 <= s 的长度 <= 10000

解决方案

先预留空间再写StringBuilder,不过实际上反而更慢了。

class Solution {
    public String replaceSpace(String s) {
        long moreSpace = s.chars().filter(ch -> ch == ' ').count();
        StringBuilder stringBuilder = new StringBuilder((int) (s.length() + 2 * moreSpace));
        for (int i = 0; i < s.length(); ++i) {
            char ch = s.charAt(i);
            if (ch == ' ') {
                stringBuilder.append("%20");
            } else {
                stringBuilder.append(ch);
            }
        }
        return stringBuilder.toString();
    }
}

直接StringBuilder其实更快一些。

class Solution {
    public String replaceSpace(String s) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < s.length(); ++i) {
            char ch = s.charAt(i);
            if (ch == ' ') {
                stringBuilder.append("%20");
            } else {
                stringBuilder.append(ch);
            }
        }
        return stringBuilder.toString();
    }
}
class Solution {
    fun replaceSpace(s: String): String {
        return buildString { 
            s.forEach {
                append(
                    when (it) {
                        ' ' -> "%20"
                        else -> it
                    }
                )
            }
        }
    }
}

书上其实是讨论原地替换类似C风格字符串的情况,从后往前写字符串可以减少插入时移动字符的开销。

class Solution {
    public String replaceSpace(String s) {
        long moreSpace = s.chars().filter(ch -> ch == ' ').count();
        char[] str = new char[(int) (s.length() + 2 * moreSpace)];

        int ptr2 = str.length - 1;
        for (int ptr1 = s.length() - 1; ptr1 >= 0; --ptr1) {
            if (s.charAt(ptr1) == ' ') {
                str[ptr2--] = '0';
                str[ptr2--] = '2';
                str[ptr2--] = '%';
            } else {
                str[ptr2--] = s.charAt(ptr1);
            }
        }

        return String.valueOf(str);
    }
}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据