剑指offer-面试题5:替换空格

题目描述

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
(进阶:不使用额外的内存空间)
示例 1:

输入:s = “We are happy.”
输出:“We%20are%20happy.”
限制: 0 <= s 的长度 <= 10000

方法一(一行代码实现)

1.解题思路

利用java的replace()方法

2.代码实现
class Solution {
    public String replaceSpace(String s) {
        return s.replace(" ","%20");
    }
}
3.复杂度分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

方法二(遍历添加)

1.解题思路

新建一个StringBuilder或者StringBuffer,遍历整个字符串,当前字符为空格时,添加"%20";不是空格时,直接添加原字符。

2.代码实现
class Solution {
    public String replaceSpace(String s) {
        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();
    }
}
3.复杂度分析
  • 时间复杂度:由于要遍历整个字符串,复杂度为O(n)
  • 空间复杂度:额外创建了一个StringBuilder,复杂度为O(n)

方法三(原地修改)

1.解题思路

剑指offer书上本题的最佳解法是原地修改,因为C++语言中,String类型数据是可变的,所以可以直接在原字符串上修改。
我们可以先推算出原字符串修改后的长度,假设原字符长度为len,空格数为count,则修改后的字符串长度为len+2count,所以可以先直接设置字符串长度为len+2count。然后定义两个游标,一个负责遍历字符串,一个负责填充为变化后的字符串。(需要从后往前遍历,从前往后会改变后面为空格的位置)

2.代码实现

C++实现:

class Solution {
public:
    string replaceSpace(string s) {
        int count = 0, len = s.size();
        int indexOfOld=len-1;
        // 统计空格数量
        for (char c : s) {
            if (c == ' ') count++;
        }
        // 修改 s 长度
        s.resize(len + 2 * count);
        int indexOfNew=s.size()-1;
        // 倒序遍历修改
        for(int indexOfOld = len - 1; indexOfOld >= 0; indexOfOld--) {
            if (s[indexOfOld] != ' ')
                s[indexOfNew--] = s[indexOfOld];
            else {
                s[indexOfNew--] = '0';
                s[indexOfNew--] = '2';
                s[indexOfNew--] = '%';
            }
        }
        return s;
    }
};

java实现:

class Solution {
    public String replaceSpace(String s) {
        int len=s.length();
        int indexOfOld=len-1;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' '){
                len+=2;
            }
        }
        int indexOfNew=len-1;
        StringBuilder sb=new StringBuilder();
        sb.setLength(len);
        while(indexOfOld>=0){
            if(s.charAt(indexOfOld)==' '){
                sb.setCharAt(indexOfNew--,'0');
                sb.setCharAt(indexOfNew--,'2');
                sb.setCharAt(indexOfNew--,'%');
            }
            else{
                sb.setCharAt(indexOfNew--,s.charAt(indexOfOld));
            }
            indexOfOld--;
        }
        return sb.toString();
    }
}
3.复杂度分析
  • 时间复杂度:由于要遍历整个字符串,复杂度为O(n)
  • 空间复杂度:如果是C++实现,复杂度为O(1);如果是java实现,因为要新建StringBuilder来构建新的String,所以复杂度为O(n)

剑指offer全集入口: 请戳这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值