反转字符串中的单词
这道题理想中的操作方式就是先去除前导和尾随空格,之后设一个尾指针,往前检索,扫到一个单词就把这个单词放到字符串的第一个位置。
很明显,java中我们不能直接对字符串进行修改,而我们想实现一个一个单词放进字符串中,我们就可以联想到StringBulider中的append。
这道题首先要对字符串进行去除前后两端空格
public String trimstr(String s){int left=0;int right=s.length()-1;while(s.charAt(left)==' ' && left<right){left++;}while(s.charAt(right)==' ' && left<right){right--;}String ans=s.substring(left,right+1);return ans;}
这一步操作可以用库函数trim,但是我们建议用这种源代码便于理解。
public String reverseWords(String s) {//先去除首尾空格s=trimstr(s);//设置双指针往前遍历int i=s.length()-1;int j=i;StringBuilder res=new StringBuilder();while(i>=0){//找空格while(i>=0 && s.charAt(i)!=' ') i--;//添加单词res.append(s.substring(i+1,j+1)+' ');//跳过空格while(i>=0 && s.charAt(i)==' ')i--;j=i;}return trimstr(res.toString());}
随后,设置两个指针指向字符串的最后,让i向前遍历找第一个空格,找到第一个空格就说明i+1到j就是一个单词,让新建的StringBuilder进行append添加单词。
之后的任务就是找到下一个单词的尾部,遍历到第一个不是空格的字符,那么就是下一个单词的尾部,此时让指针j指向i所在的位置,j永远指向单词的尾部。
右旋字符串
这道题很明显就是从尾部往前遍历k次,找到唯一需要反转的这个单词,然后建立StringBuilder,append两次,就解题了
import java.util.Scanner;public class Main
{public static void main(String[] args){Scanner sc=new Scanner(System.in);int k=sc.nextInt();String s=sc.next();StringBuilder sb=new StringBuilder();int start=s.length()-1;int end=start;for(int i=0;i<k;i++){start--;}sb.append(s.substring(start+1,end+1)).append(s.substring(0,start+1));String ans=sb.toString();System.out.println(ans);}
}
这里的两个substring坐标不要搞混了,如果碰上类似这两题的单词字符串反转,合理使用StringBulider可以让我们的代码更加简洁易懂