01.03. URL化

01.03. URL化

1、题目

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

2、初步作答

2.1 思路

题目给出了一个解决方法,将字符串改成字符数组,进行数组操作。那么我们就开始直接用 toString 这个方法去做。

2.2 做法

  • 将字符串 s1 改写成字符数组 s2

  • 建立一个三倍与字符串长度的新字符数组char[](将代码放入)

  • 建立一个与字符串长度一致的数组 num[],记录空格所在位置

  • 建立 for 循环,以“真实”长度为最大循环次数

    • 如果 s2 不是空格就填入 char[],空格就不进行操作
  • 建立 for 循环,从“真实”长度开始循环,再减减

    • 如果对应位置的 num 数组有值,则依次填入 % ;2 ;0 到 char 数组
    • 从后往前开始填入 %20
  • 最后把字符串数组输出

2.3 代码

public class Code_01_03URL {
    public static void main(String[] args) {
        String string = new String();
        string = "Mr John Smith    ";
        int k = 13;
        string = replaceSpaces(string, k);
        System.out.println(string);
    }

    public static String replaceSpaces(String S, int length) {
        char[] s = S.toCharArray();
        int m = S.length();
        int[] num = new int[m];
        m = 3 * m;
        char[] scr = new char[m];
        for (int i = 0; i < length; i++) {
            if (s[i] == ' ') {
                scr[i] = 0;
            } else {
                num[i] = 1;
                scr[i] = s[i];
            }
        }
        int n = 0;
        for (int j = length; j > 0; j--) {
            if (num[j - 1] == 0) {
                n++;
                for (int b = length + (2 * n); b >= j - 1; b--) {
                    scr[b + 2] = scr[b];
                }
                for (int a = 1; a < 4; a++) {
                    if (a == 1) {
                        scr[j + 1] = '0';
                    } else if (a == 2) {
                        scr[j] = '2';
                    } else if (a == 3) {
                        scr[j - 1] = '%';
                    }
                }
            }
        }
        //String s1 = scr.toString();
        //String[] arr ={"0123","sb","12f"};
        StringBuffer sb = new StringBuffer();
        for(int i = 0;i<length + (2*n);i++){
            sb.append(scr[i]);
        }
        String sb1 = sb.toString();
        return sb1;
    }
}
输入 "Mr John Smith "13
输出 "Mr%20John%20Smith"
预期结果 "Mr%20John%20Smith"
  • 本题将字符串修改为字符数组后使用暴力解法。运用了两个 for 循环,创建了两个数组空间和一个 StringBuffer 空间,所以在运行时间上存在较大缺陷。(导致的结果就是力扣上的测试用例可以通过,但是提交时超出了时间限制。)

2.4 思考

本题的整型数组 num 是为了确定空格位置,字符数组 s 是为了保存字符串 S 转成的字符数组。那我们有什么办法可以不用创建这两个数组就可以完成其功能,这样不就可以大大减少空间消耗和时间消耗。

3、解法优化

3.1 思路介绍

  • 我们采用 StingBuffer 类(因为 StingBuffer 类型的数据可以进行多次修改,且不创建新的对象)
  • 使用 CharAt 对字符串数据进行读取,这样也减少了字符数组 s 的创建。

3.2 代码(优化)

public class Code_01_03URL_optimize {
    public static void main(String[] args) {
        String string = new String();
        string = "Mr John Smith    ";
        int k = 13;
        string = replaceSpaces(string, k);
        System.out.println(string);
    }

    public static String replaceSpaces(String S, int length) {
        StringBuffer s = new StringBuffer();
        char s1;
        for (int i = 0; i < length; i++) {
            s1 = S.charAt(i);
            if(s1 == ' '){
                s.append("%20");
            }else{
                s.append(s1);
            }
        }
        return s.toString();
    }
}
执行用时:25 ms, 在所有 Java 提交中击败了18.15%的用户
内存消耗:49 MB, 在所有 Java 提交中击败了9.37%的用户
通过测试用例:32 / 32

3.3 反思

虽然在执行时间上相比未优化前有了较大的减少,可以通过力扣,但是不管是时间复杂度还是空间复杂度都不好。好吧,承认自己是菜鸡了,再次哭球!

那下面我们看一下大佬的代码,学习一下。

3.4 大佬代码学习

3.4.1 一行代码(震撼自我)

  • 来自力扣作者:li-hao-nan-s
class Solution {
    public String replaceSpaces(String s, int length) {
        return s.substring(0, length).replace(" ", "%20");
    }
}

3.4.2 遍历

class Solution {
    public String replaceSpaces(String S, int length) {
        //先把字符串转化为字符数组
        char[] chars = S.toCharArray();
        int index = chars.length - 1;
        for (int i = length - 1; i >= 0; i--) {
            //如果遇到空格就把他转化为"%20"
            if (chars[i] == ' ') {
                chars[index--] = '0';
                chars[index--] = '2';
                chars[index--] = '%';
            } else {
                chars[index--] = chars[i];
            }
        }
        return new String(chars, index + 1, chars.length - index - 1);
    }
}

posted @   曦月宇望  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示