代码随想录算法训练营|151.翻转字符串里的单词 、卡码网:55.右旋转字符串
151.翻转字符串里的单词
题目
参考文章
思路:这道题目的整体思路就是先把该字符串中首尾以及中间多余的空格去掉,首尾空格可以通过while循环判断,设置一个存储字符串的新变量,中间的多余空格则是当遇到当前位置是空格时且新变量当前位置不是空格时,把当前遇到的空格加入到新变量中否则是不加入的,这样就保证了每个单词之间就只有一个空格了;然后整体反转字符;最后反转各个单词(这里的反转可以用到第二步的反转方法)
代码:
class Solution {
public String reverseWords(String s) {
StringBuilder sb=removeSpace(s);
reverseString(sb,0,sb.length()-1);
reverseEachWord(sb);
return sb.toString();
}
//去除多余空格
private StringBuilder removeSpace(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 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--;
}
}
//反转每个单词的字符
private void reverseEachWord(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;
}
}
}
卡码网:55.右旋转字符串
题目
参考文章
思路:这题的思路其实就是反转字符串;因为是把字符串后n个字符移到头部,所以首先我们把这个字符串分为两段来操作,一段就是 0~len-n-1,另一段是 len-n~len-1,我们现在就是把len-n~len-1这一段给移到头部。首先输入一个n和一个字符串,然后提取字符串长度,设置一个字符数组用于存储字符串转化为字符数组的元素;现在重头戏就是反转字符串,首先是先反转整个字符串,反转整个字符串后,相当于把尾部的字符移到了头部,然后就是部分反转,因为把尾部迁移到了头部,所以把前面字符反转即反转 0~n-1,然后再反转 n~len-1;最后就可以得到旋转后的正确字符串了,输出即可
代码:
import java.util.Scanner;
public class Main {
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[] sb=s.toCharArray();
reverseString(sb,0,len-1);
reverseString(sb,0,n-1);
reverseString(sb,n,len-1);
System.out.println(sb);
}
public static void reverseString(char[] ch, int start, int end) {
while(start<end){
char temp=ch[start];
ch[start]=ch[end];
ch[end]=temp;
start++;
end--;
}
}
}