替换空格
题目描述
思路
原地修改
适用于c++这种字符串可变的语言,可以直接使用双指针法
双指针法
先将原空间扩容至结果所需大小,然后两个指针分别指向旧的和新的的尾部,往前移动,遇到需要替换的则替换后加入,否则直接加入。
从前往后的话插入未知后面的内容都会移动,时间复杂度增大,故从后往前。
主要是学双指针法的思想,适合在c++里用
遍历法
就遍历,然后替换加入到StringBuilder中,然后转成字符串返回,不允许用StringBuilder就直接加
代码实现
class Solution {
public String replaceSpace(String s) {
StringBuilder result=new StringBuilder();
char[]array=s.toCharArray();
for(int i=0;i<array.length;i++){
//注意是字符类型,别写成字符串了
if(array[i] ==' '){
result.append("%20");
}else{
result.append(array[i]);
}
}
return result.toString();
}
}
复杂度分析
时间复杂度
O(n)
空间复杂度
O(n)
反思不足
思路
本题限制很少,怎么做都可以,主要是积累api吧
java se
String类不熟悉
创建时可传入数组,起始索引,终止索引以构建字符串
new String(arrays,0,len);
charAt方法根据索引获取字符
s.charAt(1);
replaceAll方法根据正则表达式用目标字符串替换
s.replaceAll(" ","%20");
toCharArray方法转换为字符数组
s.toCharArray();
length()获取长度
substring获取子字符串(注意是小写s)
s.substring(0,s.length);
StringBuilder类不熟悉
append方法追加字符串
s.append("%20");
左旋转字符串
题目描述
思路
切片+拼接
遍历法
根据有无对StringBuilder的限制又可分为两种
使用时可以通过取余简化代码
代码实现
切片+拼接
class Solution {
public String reverseLeftWords(String s, int n) {
return s.substring(n,s.length())+s.substring(0,n);
}
}
遍历法
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder result=new StringBuilder();
for(int i=n;i<s.length()+n;i++){
result.append(s.charAt(i%s.length()));
}
return result.toString();
}
}
复杂度分析
时间复杂度
切片+拼接,O(n),字符串切片函数为线性时间复杂度
遍历,O(n)
空间复杂度
均为O(n),前者是切片子字符串所致,后者是辅助空间所致
反思不足
审题
标签:String,offer,day03,StringBuilder,复杂度,substring,int,字符串 From: https://www.cnblogs.com/zhouj-learn/p/16769168.html一开始还以为是交换前n个和末n个字符串的位置。
貌似没有限制的话,那些取巧的现成api是可以用的,但是其时间复杂度之类的可能不如自己设计的