剑指offer系列——44.翻转单词顺序列/翻转字符串里的单词
Q:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
A:熟练运用reverse函数
string ReverseSentence(string str) {
if (str.empty())
return str;
int index1 = 0;
int index2 = 0;
reverse(str.begin(), str.end());
while (index1 < str.size()) {
while (str[index2] != ' ' && index2 < str.size())
index2++;
reverse(str.begin() + index1, str.begin() + index2);
index2++;
index1 = index2;
}
return str;
}
Q:给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
A:
各种库函数齐上阵
public String reverseWords(String s) {
if (s.isEmpty())
return "";
String[] str = s.split(" ");//可能有“”
ArrayList<String> array = new ArrayList<>();
for (String sub : str) {
if (!sub.isEmpty())
array.add(sub);
}
Collections.reverse(array);
return String.join(" ", array);
}
但调用了API,有点对不起这中等难度啊
纯手写API:
public String reverseWords(String s) {
if (s.isEmpty())
return "";
int slow = 0;
int fast = slow;
Stack<String> stack = new Stack<>();
while (slow != s.length()) {
if (s.charAt(slow) == ' ') {
slow++;
continue;
} else {
fast = slow + 1;
while (fast < s.length() && s.charAt(fast) != ' ') {
fast++;
}
stack.push(s.substring(slow, fast));
slow = fast;
}
}
StringBuilder stringBuilder = new StringBuilder();
if(stack.empty())
return "";
stringBuilder.append(stack.pop());
while(!stack.empty()){
stringBuilder.append(" ");
stringBuilder.append(stack.pop());
}
return stringBuilder.toString();
}