反转字符串总结
1.反转字符串
反转字符串
class Solution {
public void reverseString(char[] s) {
int left=0;
int right =s.length-1;
//快慢指针交换首位
while(left<right){//利用了a^b^b=a这一特性
s[left]^=s[right];
s[right]^=s[left];
s[left]^=s[right];
left++;
right--;
}
}
}
2.反转字符串 II
反转字符串 II
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){
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
return new String(ch);
}
}
3.替换空格
替换空格
class Solution {
public String replaceSpace(String s) {
StringBuilder sb =new StringBuilder();
if(s==null) return null;
for(int i=0;i<s.length();i++){
//如果当前字符串时空格
if(" ".equals(String.valueOf(s.charAt(i)))){//注意将char类型转换位String类型
sb.append("%20");//将此位置添加为%20
}else{
sb.append(s.charAt(i));
}
}
return sb.toString();//注意:输出String类型,要将StringBuilder转换为String
}
}
4.翻转字符串里的单词
翻转字符串里的单词
class Solution {
/**
1.去掉空格(在前面、后面或者单词间包含多余的空格)
2.反转字符串
3.反转单词
*/
public String reverseWords(String s) {
StringBuilder sb= removeSpace(s);
reverseString(sb,0,sb.length()-1);
reverseEachWoed(sb);
return sb.toString();
}
//去掉空格
private StringBuilder removeSpace(String s){
StringBuilder sb =new StringBuilder();
int left =0;
int right = s.length()-1;
while(s.charAt(left)==' ') left++;//从前面去空格
while(s.charAt(right)==' ') right--;//从后面去空格
//去掉中间的空格
while(left<=right){
char ch = s.charAt(left);
if(ch!=' '||sb.charAt(sb.length()-1)!=' '){//核心代码
sb.append(ch);
}
left++;
}
return sb;
}
//反转字符串
private void reverseString(StringBuilder sb,int left,int right){
while(left<right){
char temp =sb.charAt(left);//临时存储
sb.setCharAt(left,sb.charAt(right));//将字符串中指定的位置的字符替换成目标字符
sb.setCharAt(right,temp);//将字符串中指定的位置的字符替换成目标字符
left++;
right--;
}
}
//反转单词
private void reverseEachWoed(StringBuilder sb){
int start = 0;
int end = 1;
int n = sb.length();
while (start < n) {
while (end < n && sb.charAt(end) != ' ') {
end++;
}
reverseString(sb, start, end - 1);
start = end + 1;
end = start + 1;
}
}
}
5.左旋转字符串
左旋转字符串
class Solution {
/**
1.先局部反转(前n项)
2.再反转剩余的
3.再全体反转
*/
public String reverseLeftWords(String s, int n) {
StringBuilder sb =new StringBuilder(s);
int right=s.length()-1;
reverseString(sb,0,n-1);
reverseString(sb,n,right);
return sb.reverse().toString();
}
/**
反转字符串
*/
private void reverseString(StringBuilder sb,int left,int right){
while(left<right){
char temp = sb.charAt(left);//暂时存储当前第一个位置的字符
sb.setCharAt(left,sb.charAt(right));
sb.setCharAt(right,temp);
left++;
right--;
}
}
}