java做3,3URL化-java实现

第三题:URL化

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

示例1:

输入:"Mr John Smith ", 13

输出:"Mr%20John%20Smith"

示例2:

输入:" ", 5

输出:"%20%20%20%20%20"

提示:

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

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/string-to-url-lcci

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

V1版本

这题主要是要将[空格]转换成[%20],且知道字符的长度,且java需要用字符数组实现

v1解题思路

1,定义一个已知道长度的数组

2,依次获取字符串中的字符,获取到空格就在数组相应位置添加 [%20],否则将原字符添加到数组中

3,将数组转成string

代码如下

public String replaceSpaces(String s, int length) {

String[] strArray = new String[length];

for (int i = 0; i < length; i++) {

if (' ' == s.charAt(i)) {

strArray[i] = "%20";

continue;

}

strArray[i] = String.valueOf(s.charAt(i));

}

StringBuilder sb = new StringBuilder(length);

for (String str : strArray) {

sb.append(str);

}

return sb.toString();

}

功能是简单,性能可不够看呀,其它完全不需要用到字符数组,可这是硬性规定

16acdc4fbc1e

image.png

V2

之前没发现这句【假定该字符串尾部有足够的空间存放新增字符】

开始担心用char数组不知道长度,添加起来可能还需要扩容,所以改用的string[],这下不用担心了

代码如下

public String replaceSpaces(String s, int length) {

char[] chars = new char[s.length()];

int j = 0;

for (int i = 0; i < length; i++) {

if (' ' == s.charAt(i)) {

chars[j++] = '%';

chars[j++] = '2';

chars[j++] = '0';

} else {

chars[j++] = s.charAt(i);

}

}

// 截取掉多余的空格

return String.valueOf(chars, 0, j);

}

16acdc4fbc1e

image.png

快是快了许多,但还只到78%

V3版本

看到评论区一有一个大佬的题解,原代码如下

public String replaceSpaces(String S, int length) {

char[] chs = S.toCharArray();

int i = length-1, j = S.length()-1;

while(i>=0){

if(chs[i]==' '){

chs[j--] = '0';

chs[j--] = '2';

chs[j--] = '%';

}else{

chs[j--] = chs[i];

}

i--;

}

return String.valueOf(chs,j+1, S.length()-j-1);

}

这个写法开始看的时候一直觉得会下标界或者是取到已赋值过的值,debug了一个才发现这个写法的精髓

用一个例子来解释一下

假设入参为

"Mr John Smith ", 13

16acdc4fbc1e

image.png

由于知道字符的长度,且原字符后面的空格数足够,这样让程序直接在当前字符数组上进行修改,不需要另外开劈空间,且跳过了后面的空格部份,减少循环次数,感觉这个解法才是最符合题意的,执行如图

16acdc4fbc1e

image.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值