151. 反转字符串中的单词
关键点:先全部反转,再部分反转
class Solution {
public String reverseWords(String s) {
//去掉前后空格和中间多余的空格
StringBuilder sb = removeBlank(s);
//全部反转
reversePart(sb, 0, sb.length()-1);
//各个单词反转
reverseEvery(sb);
return sb.toString();
}
private StringBuilder removeBlank(String s){
int start = 0;
int end = s.length()-1;
while(s.charAt(start)==' ') start++;
while(s.charAt(end)==' ') end--;
StringBuilder sb = new StringBuilder();
while(start <= end){
char c = s.charAt(start);
if(c!=' ' || sb.charAt(sb.length()-1)!=' '){
sb.append(c);
}
start++;
}
return sb;
}
public void reversePart(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--;
}
}
public void reverseEvery(StringBuilder sb){
//定义快慢指针,
//快慢指针找空格相隔的部分
int slow = 0;
int fast = 1;
while(fast<sb.length()){
while(fast<sb.length() && sb.charAt(fast)!=' '){
fast++;
}
reversePart(sb, slow, fast-1);
slow = fast + 1;
fast = slow + 1;
}
}
}
55. 右旋字符串
文章给的思路是先整体反转,在针对n和length-n进行反转。但Java中本身String就是不可变的,还是得要定义变量,所以我直接使用StringBuilder,先遍历n,再遍历length-n
- 代码
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
String str = sc.nextLine();
StringBuilder sb = new StringBuilder();
int len = str.length();
for(int i=len-n; i<len; i++){
sb.append(str.charAt(i));
}
for(int i=0; i<len-n; i++){
sb.append(str.charAt(i));
}
System.out.println(sb.toString());
}
}
- 运行结果
ps:KMP算法没看