【字符串 + 双指针】剑指 Offer 05. 替换空格

剑指 Offer 05. 替换空格


题目

力扣题目链接

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

示例 1:

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

限制:

  • 0 <= s 的长度 <= 10000

思路一:StringBuilder拼接

循环s字符串,判断每个字符是否 = ’ ',根据不同情况向StringBuilder中拼接即可,时间复杂度O(n),使用了额外空间StringBuilder,复杂度为O(n)

代码

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

时间复杂度

O(n)


思路二:双指针

1、声明StringBuilder,根据空格append两个空格,最后得出的空格字符串 + 原字符串 就是返回字符串最终的长度,需要拼接的 ‘%20’占三个字符,而原字符串已经存在一个空格,再加上StringBuilder的双空格,所以得出以上结论。

2、定义双指针,left指向原字符串结尾,right指向最终字符串结尾,这样一来,left ~ right 指向的就是第一步StringBuilder的空格子串。

3、利用双指针这里从后向前根据情况填充字符即可。

代码

public String replaceSpace02(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();
    //这里从后向前填充
    //从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。
    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);
}

时间复杂度

O(n)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值