題目:
字符串移動(字符串爲’*’號和26個字母的任意組合,把’*’號都移動到最左側,把字母移到最右側並保持相對順序不變),要求時間和空間複雜度最小.
解析:
主要問題是時間複雜度和空間複雜度,不過不考慮時間和空間複雜度,可以另外建立兩個字符數組,把’*’和非’*’,分別放進去,再組合成字符串,就可以了.
那麼要保持時間複雜度爲(n),空間複雜度爲(1),就需要進一步考慮.思路就是設定一個下標i指向字符串第一個非’*’的位置,然後設定遍歷下標k爲i的前一個,遍歷字符串,如果爲’*’,那麼不做處理,如果爲非’*’,那麼交換下標i和下標k的字符值,然後讓i向前移動一個,保持指向第一個’*’.
import java.util.*;
public class Main{
public static void main(String[] args){
String str="a**b*c**d*";
char[] arr=str.toCharArray();
int i=arr.length-1;
while(arr[i]!='*'){
i--;
}
for(int k=i-1;k>=0;k--){
if(arr[k]!='*'){
arr[i]=arr[k];
arr[k]='*';
i--;
}
}
for(int k=0;k<arr.length;k++){
System.out.print(arr[k]);
}
System.out.println();
}
}