151.翻转字符串里的单词
基本思路:第一步:先消除头尾空格,以及中间多余的空格(逻辑:fast指针和fast-1指针都是空格则跳过本轮循环 && fast指针大于0时,因为fast从头开始,经过删除后头一定不是空格,所以指向0时不用判断是否为连续空格);第二步:字符串全部反转;第三步:单词反转(负负得正了。)
几个没用过的API,sb.setCharAt(index,element).
class Solution {
public String reverseWords(String s) {
char[] ch = s.toCharArray();
StringBuilder sb = new StringBuilder();
int start = 0;
int slow = start;
int end = s.length() -1;
while(s.charAt(start) == ' '){
start++;
}
while(s.charAt(end) == ' '){
end--;
}
for(int fast = start;fast <= end; fast++){
if(slow > 0 && s.charAt(fast-1) ==' ' && s.charAt(fast) == ' '){
continue;
}
sb.append(s.charAt(fast));
slow++;
}
//sb.reverse();
reverseStr(sb,0,sb.length() - 1);
reverseWord(sb,0,sb.length() - 1);
return sb.toString();
}
//反转字符串
public StringBuilder reverseStr(StringBuilder sb, int start, int end){
char temp;
while(start < end){
temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
return sb;
}
//反转字符串的单词
public StringBuilder reverseWord(StringBuilder sb, int start, int end) {
int right = 0;
int left = 0;
for (int i = 0; i < sb.length(); i++) {
if(sb.charAt(i) == ' '){
right = i;
reverseStr(sb,left,right - 1);
left = i + 1;
}
if(i == sb.length() -1){
reverseStr(sb,left,i);
}
}
return sb;
}
}
卡码网:55.右旋转字符串
沿用上一题的思路:先整体反转,再局部反转。
第一步整体反转,第二步找到前n个数字,因为要反转后n个数字,但是因为整体反转后,移到左侧了,即前n个数字。因此左右一起局部反转即可。
import java.text.ParseException;
import java.util.Scanner;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
String s = sc.next();
int len = s.length() - 1;
StringBuilder sb = new StringBuilder();
for(int i = len; i >= 0; i--){
sb.append(s.charAt(i));
}
//reversesb(sb, 0, len);
reversesb(sb,0,n-1);
reversesb(sb,n,len);
System.out.println(sb);
}
public static StringBuilder reversesb(StringBuilder sb, int start, int end){
char temp;
while( start < end){
temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
return sb;
}
}