151.反转字符串中的单词
给你一个字符串
s
,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。
s
中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
**注意:**输入字符串
s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
//使用栈实现,空间复杂度为O(n)
class Solution {
public String reverseWords(String s) {
if (s == null || s.isEmpty()) //shorcut
return "";
Stack<String> stack = new Stack<>();
int start = 0;
int end = s.length() - 1;
while(s.charAt(start) == ' ')//去除前导空格
start++;
while(s.charAt(end) == ' ')//去除尾随空格
end--;
int wordStart = start;//两个指针用来截取单词
int wordEnd = start;
while(wordEnd <= end) {
if(s.charAt(wordEnd) == ' ') {
stack.push(s.substring(wordStart, wordEnd));
stack.push(" ");//每压入一个单词的同时压入一个空格
while(s.charAt(wordEnd) == ' ')
wordEnd++;//寻找下一个单词开头
wordStart = wordEnd;
}
if(wordEnd == end) {//处理最后一个单词
stack.push(s.substring(wordStart, end + 1));
}
wordEnd++;
}
StringBuilder result = new StringBuilder();
while(!stack.empty())
result.append(stack.pop());
return result.toString();
}
}
55.右旋字符串
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
import java.util.Scanner;
import java.lang.StringBuilder;
//使用StringBuilder类完成
public class Main {
public static String reverseString(int k, String s) {
StringBuilder result = new StringBuilder();
result.append(s.substring(s.length() - k));//添加k后元素进result中
result.append(s.substring(0, s.length() - k));//添加剩余元素
return result.toString();
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int k = input.nextInt();
String s = input.next();
s = reverseString(k, s);
System.out.println(s);
}
}
- 原地修改思路(java中String不可修改,只能申请辅助空间)
- 将字符串全部反转,此时后k个元素成为前k个元素
- 分别反转前k个元素和其余元素
- 完成右旋