给定一个字符类型的数组 chas 和一个整数 size,请把大小为 size 的左半区整
体移到右半区,右半区整体移到左边。
例如,如果把 chas 看作字符串为"ABCDE",size=3,调整成"DEABC"。
如果 chas 长度为 N,两道题都要求时间复杂度为 O(N),额外空间复杂度为 O(1)。
两种解决办法:一种是分别逆序,再整体逆序,例如"ABCDE" -> "CBAED" -> "DEABC"
另一种是分别截取,例如"ABCDE" -> "DECAB" -> "DEBAC" -> "DEABC"
public static void rotateWord(char[] chas){
if(chas == null || chas.length == 0){
return;
}
int l = -1;
int r = -1;
for(int i = 0; i < chas.length; i++){
if(chas[i] != ' '){
l = i == 0 || chas[i-1] == ' ' ? i : l;
r = i == chas.length - 1 || chas[i + 1] == ' ' ? i : r;
}
if(l != -1 && r != -1){
reverse(chas, l, r);
l = -1;
r = -1;
}
}
}
public static void reverse(char[] chas, int start, int end){
char tmp = 0;
while(start < end){
tmp = chas[start];
chas[start] = chas[end];
chas[end] = tmp;
start++;
end--;
}
}
public static void rotate1(char[] chas, int size){
//分别逆序
if(chas == null || size <= 0 || size >= chas.length){
return;
}
reverse(chas, 0, size - 1);
reverse(chas, size, chas.length - 1);
reverse(chas, 0, chas.length - 1);
}
public static void rotate2(char[] chas, int size){
if(chas == null || size <= 0 || size >= chas.length){
return;
}
int start = 0;
int end = chas.length - 1;
int lpart = size;
int rpart = chas.length - size;
int s = Math.min(lpart, rpart);
int d = lpart - rpart;
while(true){
exchange(chas, start, end, s);
if(d == 0){
break;
}else if(d > 0){
start += s;
lpart = d;
}else{
end -= s;
rpart = -d;
}
s = Math.min(lpart, rpart);
d = lpart - rpart;
}
}
public static void exchange(char[] chas, int start, int end, int size){
int i = end - size + 1;
char tmp = 0;
while(size-- != 0){
tmp = chas[start];
chas[start] = chas[i];
chas[i] = tmp;
start++;
i++;
}
}