1.LeetCode151.翻转字符串里的单词
题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/
文章链接:https://www.programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html#%E6%80%9D%E8%B7%AF
视频链接:https://www.bilibili.com/video/BV1uT41177fX
思路:
主要做如下三个步骤:
1.移除多余空格。
包括:首尾空格和中间多余空格
2.反转:整体反转+局部反转
①.将整个字符串反转。
将所有字符进行翻转。
②.将每个单词反转
解法:
class Solution {
// public String reverseWords(String s) {
// String[] arr=s.trim().split(" ");
// List<String> list=new ArrayList<>();
// for(int i=0;i<arr.length;i++){
// if(arr[i].length()==0) continue;
// list.add(arr[i]);
// }
// int left=0;
// int right=list.size()-1;
// while(left<right){
// String temp=list.get(left);
// list.set(left,list.get(right));
// list.set(right,temp);
// left++;
// right--;
// }
// StringBuilder res=new StringBuilder();
// for(int i=0;i<list.size();i++){
// res.append(list.get(i));
// if(i<list.size()-1){
// res.append(" ");
// }
// }
// return res.toString();
// }
public String reverseWords(String s) {
StringBuilder sa= new StringBuilder();
//删除多余空格
sa=removeSpace(sa,s);
int start=0;
int end=sa.length()-1;
//字符串翻转
sa=reverseString(sa,start,end);
//单词翻转
sa=reverseWord(sa);
return sa.toString();
}
// 删除空格
public StringBuilder removeSpace(StringBuilder sa,String s){
int start=0;
int end=s.length()-1;
//删除开头和结尾的空格
while(start<s.length()&&s.charAt(start)==' '){
start++;
}
while(end>=0&&s.charAt(end)==' '){
end--;
}
//删除中间的空格
while(start<=end){
if(s.charAt(start)!=' '||s.charAt(start-1)!=' '){
sa.append(s.charAt(start));
}
start++;
}
return sa;
}
//翻转字符串
public StringBuilder reverseString(StringBuilder sa,int start,int end){
while(start<end){
char temp=sa.charAt(start);
sa.setCharAt(start,sa.charAt(end));
sa.setCharAt(end,temp);
start++;
end--;
}
return sa;
}
//单词翻转
public StringBuilder reverseWord(StringBuilder sa){
int start=0;
int end=1;
int len=sa.length()-1;
while(start<len){
while(end<=len&&sa.charAt(end)!=' '){//找到单词的结尾
end++;
}
reverseString(sa,start,end-1);//翻转单词
start=end+1;
end=start+1;
}
return sa;
}
}
2.卡码网:55.右旋转字符串
题目链接:https://kamacoder.com/problempage.php?pid=1065
文章链接:https://programmercarl.com/kama55.%E5%8F%B3%E6%97%8B%E5%AD%97%E7%AC%A6%E4%B8%B2.html
思路:
整体反转+局部反转:
①先将整体字符串进行翻转;
②然后将各个局部的字符串进行翻转。
注意:右旋是将尾部的局部字符串移到头部;左旋是将头部的局部字符串移到尾部。
解法:
import java.util.Scanner;
public class D{
// public static void main(String[] args){
// Scanner scan=new Scanner(System.in);
// int k=scan.nextInt();
// scan.nextLine();//消耗换行符
// String s=scan.nextLine();
// String[] arr=s.split("");
//
// D d=new D();
// //整体翻转
// d.reverse(arr,0,arr.length-1);
//
// //局部翻转
// d.reverse(arr,0,k-1);
// d.reverse(arr,k,arr.length-1);
//
// StringBuilder res=new StringBuilder();
// for(int i=0;i<arr.length;i++){
// res.append(arr[i]);
// }
//
// System.out.println(res);
// }
//
// public void reverse(String[] arr,int start,int end){
// while(start<end){
// String temp=arr[start];
// arr[start]=arr[end];
// arr[end]=temp;
// start++;
// end--;
// }
// }
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
String s = in.nextLine();
int len = s.length(); //获取字符串长度
char[] chars = s.toCharArray();
//整体翻转
reverseString(chars, 0, len - 1); //反转整个字符串
//局部翻转
reverseString(chars, 0, n - 1); //反转前一段字符串,此时的字符串首尾尾是0,n - 1
reverseString(chars, n, len - 1); //反转后一段字符串,此时的字符串首尾尾是n,len - 1
System.out.println(chars);
}
public static void reverseString(char[] ch, int start, int end) {
//异或法反转字符串,参照题目 344.反转字符串的解释
while (start < end) {
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
}