给定一个字符串s,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
题目链接
示例1:
输入: | s="Let’s take LeetCode contest " |
---|---|
输出: | “s’teL ekat edoCteeL tsetnoc” |
示例2:
输入: | s = “God Ding” |
---|---|
输出: | “doG gniD” |
方法一:
利用缓冲流StringBuffer、StringBuilder中的反转函数reverse()进行处理,对单线程场景使用StringBuilder的性能更好,多线程场景下使用StringBuffer。具体String、StringBuilder、StringBuffer之间的区别可以参考
https://blog.csdn.net/changgebuyu/article/details/86523998
代码展示:
package local;
/**
* 反转字符串中的单词,保留空格和单词顺序
* @author lihao
* @Date 2022/5/5 11:18
*/
public class ReverseWordsTest {
public static void main(String[] args) {
System.out.println(reverseWords("Let's take LeetCode contest"));
}
public static String reverseWords(String s) {
String res="";
String[] split = s.split("\\s+");//将字符串转为字符串数组,便于后期反转
int len = split.length;
for (int i = 0; i <len ; i++) {
StringBuffer sb=new StringBuffer();//利用StringBuffer中的反转函数
res+=sb.append(split[i]).reverse().toString()+" ";
}
return res.trim();//去掉最后一个单词后的多余空格
}
}
这种方法的缺点在于时间复杂度太高,在for循环中每次都要创建一个StringBuffer,对于测试例子太长的情况不友好。测试结果如下:
方法二:
原地反转,遇到空格就反转,注意:最后一个单词没有空格需要单独处理。
代码如下:
package local;
/**
* 反转字符串中的单词,保留空格和单词顺序
* @author lihao
* @Date 2022/5/5 11:18
*/
public class ReverseWordsTest {
public static void main(String[] args) {
System.out.println(reverseWords3("Let's take LeetCode contest"));
}
public static String reverseWords3(String s){
//1.先将字符串转为字符数组,判断空格的索引位置,为反转做准备
char[] chars=s.toCharArray();
int index=0;
for (int i = 0; i <chars.length ; i++) {
if(chars[i]==' '){
int left=index,right=i-1;//每个单词开始和结束位置
reverse(chars,left,right);
index=i+1;//变换索引初始位置
}
}
//单独处理最后一个单词
reverse(chars,index,chars.length-1);
return new String(chars);
}
//编写反转函数
public static void reverse(char[] chars,int left,int right){
while (left<right){
char temp=chars[left];
chars[left]=chars[right];
chars[right]=temp;
left++;
right--;
}
}
}
测试结果如下: