344.反转字符串
class Solution {
public void reverseString(char[] s) {
int left=0;
int right=s.length-1;
while(left<right){
char temp=s[left];
s[left]=s[right];
s[right]=temp;
left++;
right--;
}
}
}
541. 反转字符串II
class Solution {
public String reverseStr(String s, int k) {
char[] s1 = s.toCharArray();
int left = 0;
int right = s1.length - 1;
while (left < right) {
if ((right - left) < k) {
reverse(s1, left, right);
return new String(s1);
} else if ((right - left) < 2 * k && (right - left) >= k) {
reverse(s1, left, left + k - 1);
return new String(s1);
} else {
reverse(s1, left, left + k - 1);
left += 2 * k;
}
}
return new String(s1);
}
public void reverse(char[] s, int start, int end) {
while (start < end) {
char temp = s[start];
s[start] = s[end];
s[end] = temp;
start++;
end--;
}
}
}
151.翻转字符串里的单词
思路:先将整个字符串转化为字符数组,方便操作。然后对整个数组先进行一次反转。然后再对每一个单词进行反转。但是对单词反转的前提是把多余的空格先去掉,这里可以单独写一个去除空格的方法。
在这个方法的内部,使用双指针来操作。具体就是一个快指针fast用来找不是空格的地方,慢指针slow用来写入 数组,改进的方法是在每一个单词的末尾都要额外使用slow指针加一个空格,第一个单词前不用。
在对单词进行反转的时候,也是使用双指针来找每一个单词的起始和结尾,然后一个一个进行反转。最后将反转的新数组转化成字符串返回即可。
class Solution {
public String reverseWords(String s) {
char[] t=s.toCharArray();
//反转句子然后再反转每一个单词
int left=0;
int right=s.length()-1;
reverse(left,right,t);
//去掉首位以及多余的空格
char[] newt=removeSpace(t);
//反转每一个单词
int start=left;
int end=left;
while(start<newt.length){
//找到第一个单词的末尾并反转
while(end<newt.length&&t[end]!=' ')end++;
reverse(start,end-1,newt);
start=end+1;
end=start;
}
return new String(newt);
}
//去掉多余的空格
public char[] removeSpace(char[] s){
int slow=0;//指向添加元素的位置
for(int fast=0;fast<s.length;fast++){
//找到单词的起始位置
if(s[fast]!=' '){
if(slow!=0) s[slow++]=' ';
//fast指向空格即单词的末尾或者已经遍历完成了
while(fast<s.length&&s[fast]!=' '){
s[slow++]=s[fast++];
}
}
}
char[] news=Arrays.copyOfRange(s,0,slow);
return news;
}
//反转字符串
public void reverse(int start,int end,char[] t){
while(start<end){
char temp=t[start];
t[start]=t[end];
t[end]=temp;
start++;
end--;
}
}
}