「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」
题目
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入: s = "We are happy."
输出: "We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
题目分析
这道题目是对字符串的操作,操作还是比较简单的,遍历列表s的每个字符,然后判断,如果是是空格添加%20,不是空格添加原来的字符。
代码实现
class Solution {
public String replaceSpace(String s) {
StringBuilder result = new StringBuilder();
for (Character c: s.toCharArray()) {
if (c==' ') {
result.append("%20");
}else {
result.append(c);
}
}
return result.toString();
}
}
这里利用了StringBuilder来构建字符串,这里说一下StringBuffer和StringBuilder,这两个都继承AbstractStringBuilder,StringBuffer是线程安全的,StringBuilder是线程不安全的
StringBuffer线程安全是因为有synchronized关键字修饰
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
StringBuilder线程不安全
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuffer被synchronized修饰,所以在性能方面肯定没有StringBuilder好
下面这一下这两个类的toString()方法
StringBuffer
private transient char[] toStringCache;
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
StringBuilder
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
StringBuffer中有一个toStringCache数组,toStringCache数组是一个缓冲区,在使用toString方法的时候直接从缓冲区中拿到字符串
而StringBuilder每次复制一次字符数组,从而构造字符串。
这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉字符串的操作。
这篇文章主要是对字符串的一个替换功能的实现,然后通过源码分析了一下StringBuffer和StringBuilder的区别,通过源码我们才能懂得里面的原理。
如果有不当之处,欢迎指正。