刷题日记——替换空格

34 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 26 天,点击查看活动详情

题目:剑指Offer 05.替换空格

力扣题目链接(opens new window)

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

示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."

思路

首先是普通的我能想到的一般解法,也就是开辟一个新的空间来存放数据,这里使用StringBuilder来进行存放,比较方便,最后再将其转换回字符串的形式就可以了。

第二种解法是运用了双指针,这里也是先开辟了一个新的空间来存放空格,遍历s,当s中遇到空格时,就往sb中添加两个空格,这样sb中的空格数就是我们的目标字符串比s多的位数了,所以我们只需要将sb添加到s末尾,这样s的长度就自然地变成我们的目标字符串的长度了。

然后我们设置两个指针,在sb添加到s的末尾之前,先让left指针指向s的末尾,然后就将sb添加到s的末尾了,这时在让right指针指向新的s的末尾,如果left指针遇到了空格,就让right指针倒着输入%20,如果不是空格的话,就让right指向的位置变成left指针指向的字符。这样两个指针都向左倒着遍历。依此类推,最后我们就可以得到新的正确的字符串了,记得最后把字符数组转换成字符串型。

解法

class Solution {
    public String replaceSpace(String s) {
        if(s==null) return null;
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' ') sb.append("%20");
            else sb.append(s.charAt(i));
        }
        return sb.toString();
    }
}

另一种解法是双指针法,代码就是下面这样

class Solution {
    public String replaceSpace(String s) {
        if(s==null || s.length()==0) return s;
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' '){
                sb.append("  ");
            }
        }
        if(sb.length()==0) return s;
        int l=s.length()-1;
        s+=sb.toString();
        int r=s.length()-1;
        char[] chars=s.toCharArray();
        while(l>=0){
            if(chars[l]==' '){
                chars[r--]='0';
                chars[r--]='2';
                chars[r]='%';
            }else{
                chars[r]=chars[l];
            }
            l--;
            r--;
        }
        return new String(chars);

    }
}