多步翻转法
两步翻转法,参考 这里 的 topological sort. 其实这个 follow up 比问题一简单,因为已经告诉你了没有 trailing zeros 而且中间空格只有一个。
while 循环里套 while 的时候,记得把外层的判断条件也放到内层,否则容易越界。
public class Solution {
public void reverseWords(char[] s) {
int wordStart = 0;
int index = 0;
while(index < s.length){
while(index < s.length && s[index] != ' ') index++;
reverse(s, wordStart, index - 1);
index ++;
wordStart = index;
}
reverse(s, 0, s.length - 1);
}
private void reverse(char[] s, int start, int end){
while(start < end){
char temp = s[start];
s[start] = s[end];
s[end] = temp;
start ++;
end --;
}
}
}
稍微麻烦点,要处理各种 trailing space 和中间
public class Solution {
public String reverseWords(String s) {
if(s.length() == 0) return "";
int wordStart = 0;
int index = 0;
char[] array = s.toCharArray();
while(index < s.length()){
while(index < s.length() && array[index] == ' ') index ++;
wordStart = index;
while(index < s.length() && array[index] != ' ') index ++;
reverse(array, wordStart, index - 1);
}
StringBuilder sb = new StringBuilder();
index = s.length() - 1;
while(index >= 0){
while(index >= 0 && array[index] == ' ') index --;
while(index >= 0 && array[index] != ' '){
sb.append(array[index--]);
}
sb.append(' ');
}
return sb.toString().trim();
}
private void reverse(char[] s, int start, int end){
while(start < end){
char temp = s[start];
s[start] = s[end];
s[end] = temp;
start ++;
end --;
}
}
}
多步翻转法的另一个应用。
public class Solution {
public void rotate(int[] nums, int k) {
k = k % nums.length;
reverse(nums, 0, nums.length - k - 1);
reverse(nums, nums.length - k, nums.length - 1);
reverse(nums, 0 , nums.length - 1);
}
private void reverse(int[] nums, int start, int end){
while(start < end){
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start ++;
end --;
}
}
}
A1 a2 ..an b1 b2 ...bn -> a1b1a2b2...anbn
AaBb - ABab
a1 a2 (a3 a4 b1 b2) b3 b4 - a1 a2 b2 b1 || a4 a3 b3 b4
因为 a1 a2 长度等于 b1 b2
Last updated
Was this helpful?