目录
今日学习的文章
看到题目的第一想法
用双指针
看到代码随想录之后的想法
for循环 从前往后遍历,利用数组特性,直接进行值的交换,for循环只走一半
自己实现过程中遇到的困难
s[i] 对应s[s.length-i-i]
Java有特定的方式 使用StringBuilder方法
利用StringBuilder.setCharAt(int index,char c);可以对index位置进行值的修改
class Solution {
public void reverseString(char[] s) {
for(int i=0;i<s.length/2;i++){
char temp = s[i];
s[i] = s[s.length-1-i];
s[s.length-1-i] = temp;
}
}
}
反转字符串II(需要再研究一下)
建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。
题目链接/文章讲解/视频讲解:代码随想录
看到题目的第一想法
双指针,每次i走一个,j走两个,走k步,然后i之前的进行反转
看到代码随想录之后的想法
因为是数组,i可以直接走2K步,然后反转之前的K个
自己实现过程中遇到的困难
是否要处理最后一段元素?
每次进循环的时候判断
当i+k<=length时候就直接反转i--i+k-1
当i+k>length时候就反转剩余的
class Solution {
public String reverseStr(String s, int k) {
//我的想法,三个指针i,j,z, i走一步,j走两步,直到k步后处理前k个也就是z~i这一段,
//然后令i=2k,z=2k再往后走相同的步骤
//代码随想录做法完全没有这么复杂,直接让i每次走2k步,然后处理前k步的char,最后再另外讨论
char[] c = s.toCharArray();
for(int i=0;i<c.length;i=i+2*k){
//处理前k个
//剩余字符大于k个
if(i+k<=c.length){
reverse(i,i+k-1,c);
continue;
}
//剩余字符小于K个
reverse(i,c.length-1,c);
}
return new String(c);
}
void reverse(int i,int j ,char[] s){
//ij互换
while(i<j){
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
}
翻转字符串里的单词
建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。
题目链接/文章讲解/视频讲解:代码随想录
看到题目的第一想法
弄个新数组,然后放进去,但也没实现
看到代码随想录之后的想法
1 先把字符串去除空格(首尾和中间的空格)
2 整体进行一个反转
3 对单词进行一个反转
自己实现过程中遇到的困难
1 去除空格没思路
2 整体反转用StringBuilder
3 对单词进行一个反转 注意指针的走向
class Solution {
public String reverseWords(String s) {
//我的思路左右双指针,找空格,但是有个问题,单词的下标长度不一样
// 可以用一个新数组,左边的放右边,右边的放在左边
//char[] c1 = s.toCharArray();
//char[] c2 = new char[s.length];
// 设置双指针,将c1右边的单词放到c2左边,c1左边的单词放到右边
//int i = 0;
//int j = c1.length;
//int size;
//用一个新数组
//卡哥思路只能用o(1)的空间复杂度
//1 移除多余的空格 ,先移除前缀和后缀的空格,再移除中间多余的空格,其中有个判断,当c!=' '||sb.charAt(sb.length-1)!=' '
//C不为空或c的最后一位不为空 若遇到空,发现c的最后一位不为空,就补个空上去
//2 移除空格后数组反转 sb.setCharAt(index,string) 进行一前一后的交换
//3 反转后,每个单词反转 双指针,找到单词,进行反转,再往后走,记得最后一个单词也要反转,所以start指针要走完
//while(end<n&&sb.charAt(end)!='') end++;交换后start=end+1,end=start+1
//1 移除多余的空格 StringBuilder的用法不熟练
StringBuilder sb = new StringBuilder("");
//一个空的StringBuilder
//遍历String数组,如果为" "则不append,如果不为" "则append
//sb.setCharAt(index,string)把index设为String值
//前缀为空则++,后缀为空则--
int i = 0;
int j = s.length()-1;
while(s.charAt(i)==' '){
i++;
}
while(s.charAt(j) == ' '){
j--;
}
while(i<=j){
char c = s.charAt(i);
//c不为空或者sb的最后一位不为空(代表单词之间需要加上一位' ',而之后的' '不要)
if(c!=' '||sb.charAt(sb.length()-1)!=' '){
sb.append(s.charAt(i));
}
i++;
}
//移除数组后的反转
//sb.setCharAt(index,string);
//双指针,
reverseString(0,sb.length()-1,sb);
//反转后每个单词反转
reverseEachWord(sb);
return sb.toString();
}
public void reverseString(int start,int end,StringBuilder sb){
while(start<end){
char temp = sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,temp);
start++;
end--;
}
}
private void reverseEachWord(StringBuilder sb) {
//快慢指针法,用start和end
//end每次往后走,走到' '时候,end到start之间进行反转,然后start=end+1,end=start+1再走
int start = 0;
int end = 1;
int length = sb.length();
while(start<length){
/*if(sb.charAt(end)==' '){
reverseString(start,end-1,sb);
start = end+1;
end = start+1;
}*/
//因为要处理最后一个所以要这么写
while(end<length&&sb.charAt(end)!=' '){
end++;
}
reverseString(start,end-1,sb);
start = end+1;
end = start+1;
}
}
}