1.剑指 Offer 05. 替换空格
思路很简单,主要是复习关于字符串的内容,毕竟全部忘记了呢!
【注】在 Python 和 Java 等语言中,字符串都被设计成「不可变」的类型,即无法直接修改字符串的某一位字符,需要新建一个字符串实现。在 C++ 语言中, string 被设计成「可变」的类型(参考资料),因此可以在不新建字符串的情况下实现原地修改。
怎么做
1.遍历添加。新建一个字符串。(Java)
2.原地扩容后修改。(C++)
【摘自评论区大佬】
有同学问了,为什么要从后向前填充,从前向后填充不行么?
从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。
其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:
- 不用申请新数组。
- 从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。
3.库函数速通
return s.replace(" ","%20");
知识点:
Java StringBuffer 和 StringBuilder 类 | 菜鸟教程
java中charsequence_java中 CharSequence、Appendable 家族分析_疯狂Excel的博客-CSDN博客
2.剑指 Offer 58 - II. 左旋转字符串
想必写过408真题的人都会第一时间想到来两个反转再来个大反转...
怎么写
1.两个反转一个大反转
2.遍历拼接
1.StringBuilder(只需申请一次内存)
取余也太妙了...
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder res = new StringBuilder();
for(int i = n; i < n + s.length(); i++)
res.append(s.charAt(i % s.length()));
return res.toString();
}
}
作者:jyd
链接:https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/solution/mian-shi-ti-58-ii-zuo-xuan-zhuan-zi-fu-chuan-qie-p/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2.String(Java中字符串是不可变对象,每次拼接需新建一个字符串,系统需申请N次内存)
一些不知道哪里错了的代码
总之先放着...
class Solution {
public String reverseLeftWords(String s, int n) {
int length = s.length();
char[] anew = new char[s.length()];
s.getChars(0,length, anew , 0);
reverseall(anew,0,n-1);
reverseall(anew,n-1,length-1);
reverseall(anew,0,length-1);
return anew.toString();
}
public void reverseall(char[] an,int begin,int end){
for(int i = begin, j = end; i<j ;i++,j-- ){
char temp = an[i];
an[i] = an[j];
an[j] = temp;
}
}
}