本题要求原地修改输入数组,反转问题直接使用双指针。
class Solution {
/**
双指针直接拿下
*/
public void reverseString(char[] s) {
char temp;
int left=0;
int right=s.length-1;
while(left<right){
temp=s[left];
s[left++]=s[right];
s[right--]=temp;
}
}
}
541.反转字符串
本题的要求是每2k个字符将前k个进行反转。首先确定反转的方法使用的是双指针后,然后得看如何对这个数组进行遍历来达到题目中的反转要求。题目的要求是对每2k个字符中的前k进行反转,所以i的递增表达式应该是每次遍历递增2k;接下来的问题就是在i和i+2k这个范围内进行翻转,确定好左右指针即可。
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0;i < ch.length;i += 2 * k){
int start = i;
// 判断尾数够不够k个来取决end指针的位置
int end = Math.min(ch.length - 1,start + k - 1);
while(start < end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
class Solution {
public String replaceSpace(String s) {
if(s==null)
return null;
StringBuffer sb=new StringBuffer();
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' ')
sb.append("%20");
else
sb.append(s.charAt(i));
}
return sb.toString();
}
}
本题的要求一是单词的顺序要进行反转,而单词内的字母不进行反转,二是反转后的单词序列中单词与单词之间只有一个空格。
为了后面的反转的时间复杂度小一点点,可以选择先进行移除多余空格的操作,这里移除空格的操作利用快慢指针进行,慢指针进行单词的录入,快指针进行原字符串的遍历。
反转单词的操作,可以同个整体的翻转后先将单词置于正确的位置后,再逐个单词反转将各单词内的字母序列还原。
class Solution {
public String reverseWords(String s) {
char[] accept=s.toCharArray();
int start=0;
int end;
accept=removerSpace(accept);
end=accept.length;
reverse(0,end-1,accept);
reverseEachWord(accept);
return new String(accept);
}
public char[] removerSpace(char[] accept){
int slow=0;
for(int fast=0;fast<accept.length;++fast){
if(accept[fast]!=' '){
if(slow!=0)
accept[slow++]=' ';
while(fast<accept.length&&accept[fast]!=' ')
accept[slow++]=accept[fast++];
}
}
char[] newchar=new char[slow];
System.arraycopy(accept,0,newchar,0,slow);
return newchar;
}
public void reverse(int start,int end,char[] accept){
while(start<end){
char temp=accept[start];
accept[start++]=accept[end];
accept[end--]=temp;
}
}
public void reverseEachWord(char[] accept){
int left=0;
for(int right=0;right<accept.length;++right){
left=right;
while(right<accept.length&&accept[right]!=' ') ++right;
reverse(left,right-1,accept);
}
}
}
这一题其实就是上面反转单词中的要求一。
class Solution {
public String reverseLeftWords(String s, int n) {
int len=s.length();
StringBuilder sb=new StringBuilder(s);
reverseString(sb,0,n-1);
reverseString(sb,n,len-1);
return sb.reverse().toString();
}
public void reverseString(StringBuilder sb, int start, int end) {
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
}
}
文章介绍了几种不同的字符串反转方法,包括原地反转数组、按块反转字符串、替换空格以及反转单词。所有方法都采用了双指针技术,对于特殊要求如保留单词顺序等进行了详细处理。

2538

被折叠的 条评论
为什么被折叠?



