题目链接:https://leetcode.cn/problems/reverse-string/
class Solution {
public void reverseString(char[] s) {
int left=0;
int right=s.length-1;
while(left
题目链接:https://leetcode.cn/problems/reverse-string-ii/
刚开始想的时候,总想弄个计数器算下要反转几次。实际上定义start,每次跳2*k格,再定义end判断后面的元素够不够反转的。仔细理解一下start+k-1,如果k=2,end就在start+1位置;如果k=3,end就在start+2位置。都处在反转范围内,不在范围内的就不会进行操作。
class Solution {
public String reverseStr(String s, int k) {
char[] ch=s.toCharArray();
for(int i=0;i
题目链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof/
1.首先扩充原字符串大小。遇到一个空格,添加两个大小,这样s+=str.toString()后,原来一个空格的大小扩充成可以替换为‘%20’的大小。
2.定义一个left,指向原字符串末尾。再定义一个right,指向扩充后的字符串末尾。从后往前走,当left遇到空格时需要替换了,就让right=0,right-1=2,right-2=%。没遇上空格时不需要替换,直接把left的值赋给right。
3.为什么要从后往前走?
1.不用申请新数组。
2.如果从前往后走,在添加元素之后的每个元素都需要向后移,时间复杂度为O(n2)。
class Solution {
public String replaceSpace(String s) {
StringBuilder str=new StringBuilder();
for(int i=0;i=0){
if(ch[left]==' '){
ch[right--]='0';
ch[right--]='2';
ch[right]='%';
}else{
ch[right]=ch[left];
}
left--;
right--;
}
return new String(ch);
}
}
1.char是基本的数据类型,string是一个类。这是二者本质的区别。
2.char表示字符,定义时使用单引号,只可以存储一个字符。
3.String表示字符串,定义时使用双引号,可以存储一个或多个字符。
1.通过下标索引
String s="今天是周一!";
char ch=s.charAt(0);
2.在数组中,用一种方法也可以做到。使用String.toCharArray()(返回值为char[])可以得到将包含整个String的char数组。这样我们就能够使用从0开始的位置索引来访问string中的任意位置的元素。
String s = String.valueOf('c'); //效率最高的方法
String s = String.valueOf(new char[]{'c'}); //将一个char数组转换成String String s = Character.toString('c'); // Character.toString(char)方法实际上直接返回String.valueOf(char)
String s = new Character('c').toString();
String s = "" + 'c'; // 虽然这个方法很简单,但这是效率最低的方法
// Java中的String Object的值实际上是不可变的,是一个final的变量。
// 所以我们每次对String做出任何改变,都是初始化了一个全新的String Object并将原来的变量指向了这个新String。
// 而Java对使用+运算符处理String相加进行了方法重载。
// 字符串直接相加连接实际上调用了如下方法:
// new StringBuilder().append("").append('c').toString();
String s = new String(new char[]{'c'});
StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是StringBuilder对象中的内容是可变的。
StringBuilder sb = new StringBuilder();
// 对象名.length() 序列长度
System.out.println(sb.length()); // 0
// 对象名.append() 追加到序列
sb.append("hello");
System.out.println(sb); // hello
// 97代表的是是'a'
sb.appendCodePoint(97);
System.out.println(sb); // helloa
// 链式编程
sb.append(1).append("world").append(2);
System.out.println(sb); // helloa1world2
// 索引是5的位置替换成空格
sb.setCharAt(5, ' ');
System.out.println(sb); // hello 1world2
// 指定位置0前插入0
sb.insert(0, 0);
System.out.println(sb); // 0hello 1world2
// 删除索引6(包含)至索引14(不包含)的字符串
sb.delete(6, 14);
System.out.println(sb); // 0hello
// StringBuilder类型转换成String类型
String s = sb.toString();
System.out.println(s); // 0hello
// 以及还有截取、反转、替换等方法
1.String内容是不可变的,StringBuilder内容是可变的。
2.StringBuilder处理字符串性能比String好。
// string转换成StringBuilder
String str = "hello";
StringBuilder sb = new StringBuilder(str);
System.out.println(sb); // hello
// StringBuilder转换成String
String s = sb.toString();
System.out.println(s); // hello
题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/
1.先删除字符串中多余的空格,即删除除单词之间的一个空格之外的全部空格。
2.将字符串中的所有字母反转。
3.再将单个单词的字母反转。这样,就达到了反转字符串中的单词的目的。
class Solution {
public String reverseWords(String s) {
StringBuilder sb=new StringBuilder();
sb = removeExtraSpace(s);
reverseString(sb,0,sb.length()-1);
reverseEachWord(sb);
return sb.toString();
}
//移除多余空格
public StringBuilder removeExtraSpace(String s){
int start=0;
int end=s.length()-1;
while(s.charAt(start)==' ') start++;//让start移到第一个字母出现的位置
while(s.charAt(end)==' ') end--;//让end移到最后一个字母出现的位置
StringBuilder sb=new StringBuilder();
while(start<=end){//当start=end时,即遍历到最后一个字母,是需要加入这个元素的,所以取<=
char ch=s.charAt(start);
if(ch!=' '||sb.charAt(sb.length()-1)!=' '){//遍历到字母或者sb末尾不是空格,加入元素。如果遍历到空格然而sb末尾已是空格,则不加。
sb.append(ch);
}
start++;
}
return sb;
}
//反转字符串
public void reverseString(StringBuilder sb, int start, int end) {
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));//setCharAt(i,j):给字符串i位置赋值j
sb.setCharAt(end, temp);
start++;
end--;
}
}
//反转各单词
public void reverseEachWord(StringBuilder sb){
int start=0;
int end=1;
int n=sb.length();
while(start
题目链接:https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/
1.例如"abcdefg",n=2。先反转整个字符串,得到"gfedcba"。
2.再反转下标0到len-1-n的元素,得到"cdefgba"。
3.最后反转下标len-n到len-1的元素,得到"cdefgab"。
4.自己实现的时候忘记定义StringBuilder类了。要记住字符串s是不可变的,要修改就要定义StringBuilder类。
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder sb=new StringBuilder(s);
int len=s.length();
reverse(sb,0,len-1);
reverse(sb,0,len-1-n);
reverse(sb,len-n,len-1);
return sb.toString();
}
public void reverse(StringBuilder sb,int start,int end){
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));//setCharAt(i,j):给字符串i位置赋值j
sb.setCharAt(end, temp);
start++;
end--;
}
}
}