【百日算法计划】:每日一题,见证成长(002)

题目

替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”

思路1

  • 统计字符数组中空格的个数
  • 开辟一个新数组,长度为原字符串长度+2*空格数
  • 拷贝原字符到新字符数组中

时间复杂度O(n) 空间复杂度O(n)

public static String replaceSpace1(String s) {
    char[] chars = s.toCharArray();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] != ' '){
            sb.append(chars[i]);
        } else {
            sb.append("%20");
        }
    }
    return sb.toString();
 }
 public static String replaceSpace2(String s) {
    char[] chars = s.toCharArray();
    int length = chars.length;
    int num = 0;

    for (int i = 0; i < length; i++) {
        if (chars[i] == ' '){
            num++;
        }
    }

    int k = 0;
    char[] chars1 = new char[length + num * 2];
    for (int i = 0; i < chars.length; i++){
        if (chars[i] != ' '){
            chars1[k] = chars[i];
            k++;
        } else {
            chars1[k++] = '%';
            chars1[k++] = '2';
            chars1[k++] = '0';
        }
    }
    return new String(chars1);
 }

思路2

  • 统计字符数组中空格的个数
  • 开辟一个新数组,长度为原字符串长度+2*空格数
  • 定义指针p1和 p2 分别指向原数组和新数组的末尾
  • 遍历两个数组,若碰到空格,p1向前移动1位,新数组插入%20,p2向前移动3位
  • 若不是空格,逐个把p1碰到的字符拷贝到p2,p1和p2都向前移动一位

时间复杂度O(n) 空间复杂度O(n)

    /**
     * 双指针的解法
     */
    public static String replaceSpace3(String s) {
        char[] oChar = s.toCharArray();
        int emptySize = 0;//空格数
        for (int i = 0; i < oChar.length; i++) {
            if (oChar[i] == ' '){
                emptySize++;
            }
        }
        char[] nChar = new char[oChar.length + emptySize * 2];//开辟一个新数组
        int p1 = oChar.length - 1;//指针p1指向原数组的末尾
        int p2 = nChar.length - 1;//指针p2指向新数组的末尾
        while (p1 >= 0 && p2 >= 0){
            char o1 = oChar[p1];
            if (o1 == ' '){ //若碰到空格,p1向前移动1位,新数组插入%20,p2向前移动3位
                nChar[p2] = '0';
                nChar[p2 - 1] = '2';
                nChar[p2 - 2] = '%';
                p1 -= 1;
                p2 -= 3;

            } else { //若不是空格,逐个把p1碰到的字符拷贝到p2,p1和p2都向前移动一位
                nChar[p2] = o1;
                p1 -= 1;
                p2 -= 1;
            }
        }
        return String.valueOf(nChar);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值