leetcode-面试题 01.03 URL化

100 阅读1分钟

题目描述:

编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)

示例 1:
输入:"Mr John Smith", 13
输出:"Mr%20John%20Smith"

示例 2:
输入:" ", 5 输出:"%20%20%20%20%20"

提示:
字符串长度在 [0, 500000] 范围内。

题解:

方法一:创建额外数组

思路:

1)创建字符数组,最大长度为字符串长度的3倍(字符串中所有字符都是空格,都需要替换)。

2)遍历字符串中的每个字符,判断该字符是否是空格:

  • 该字符是空格,将'%' '2' '0'三个字符依次添加到字符数组。
  • 该字符不是空格,将该字符添加到字符数组。

3)将字符数组转换为字符串并返回。

代码:

public String replaceSpaces(String S, int length) {
    char[] newCharArray = new char[length*3];
    int size = 0;
    for(int i = 0;i < length;i++){
        if(S.charAt(i) == ' '){
            newCharArray[size++] = '%';
            newCharArray[size++] = '2';
            newCharArray[size++] = '0';
        }else {
            newCharArray[size++] = S.charAt(i);
        }
    }
    return new String(newCharArray, 0, size);
}

复杂度分析:

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

方法二:原地倒序填充

思路:

1)将字符串转换为字符数组。

2)倒序遍历字符数组,判断每个字符是否是空格:

  • 该字符是空格,将'0' '2' '%'三个字符依次添加到字符数组后面。
  • 该字符不是空格,将该字符添加到字符数组。

3)从字符数组中截取有效部分转换为字符串并返回。

代码:

public String replaceSpaces(String S, int length) {
    char[] charArray = S.toCharArray();
    int n = S.length();
    int j = n - 1;
    for(int i = length - 1;i >= 0;i--){
        if(S.charAt(i) == ' '){
            charArray[j--] = '0';
            charArray[j--] = '2';
            charArray[j--] = '%';
        }else {
            charArray[j--] = S.charAt(i);
        }
    }
    return new String(charArray, j+1, n - 1 - j);
}

复杂度分析:

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

注:Java中的String为final修饰,不存在真正意义上的“原地修改”,但是这里提供了一种思路,对于其他语言(如c++)是可以提升空间复杂度的。

leetcode链接:面试题 01.03 URL化