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);
}
}
分类:
力扣-面试题刷题笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)