2014-03-25 56 views
-1

我想用常量空間反轉字符串中的單詞。問題是這些單詞不能包含連續的空格。我想將單詞之間的所有連續空格縮減爲一個空格,並忽略前導空格和尾部空格。我能夠實現字的逆轉,但我努力實現刪除單詞與前後空白之間的連續空格。有人能幫我嗎?char [] /句子的反向詞

這是我到目前爲止有:

public char[] reverseWords(char[] s) { 

    if (s == null) 
     return null; 

    int right = 0; 


    s = reverseString(s, 0, s.length - 1);// get the reversed sentence 
    //System.out.println(s); 
    for (int left = 0; left < s.length; left++) { 

     if (s[left] != ' ') {// for first word 

      for (right = left; right < s.length && s[right] != ' '; right++) 
       ; // get end of word 

      s = reverseString(s, left, right - 1); 
      left =(right - 1);// move left index to end of 
               // word 

      // s[left++] = ' '; 
     } 

    } 
    return s; 
} 

public char[] reverseString(char[] strChars, int start, int end) { 

    if (strChars == null) 
     return null; 

    while (start < end) { 

     char temp = strChars[start]; 
     strChars[start] = strChars[end]; 
     strChars[end] = temp; 

     start++; 
     end--; 
    } 
    return strChars; 
} 
+0

是的,你會怎麼做整個句子的字符數組? – user2441441

+0

對。我以爲你的問題說「絃樂」。我的錯。 –

+0

你可以做'.replace(「」,「」)'? – Aarowaim

回答

1

還有就是會更容易/更快的方式。我只是給出一個應該在學習目的上很好的思想。

首先,做任何你現在擁有的,反過來的話,並保持這些連續的空間不變。

然後寫另一種方法來做連續的空間去除。

有2個指針,從第一個位置開始,它不是空格。

A和B一起繼續前進。

如果(A!= B),然後我們做s[A] = s[B]; s[B] = ' ';

如果s[A]s[A-1]的空間,然後停止(A現在處於第2空間),僅有B繼續向前發展。通過這種方式,A保持相同的位置並將繼續從B複製,直到B給出非空格字符。

它在B結束時結束。

在僞代碼

,它是像

int a = first position of non-space; 
int b = a; 

while b < s.size() { 
    if (a != b) { 
    s[a] = s[b] 
    s[b] = ' ' 
    } 
    if (both s[a] and s[a-1] are space) { 
    increment b; 
    // leave a untouched 
    } else { 
    increment a; 
    increment b; 
    } 
} 

常數空間,O(n)的時間


的另一種方式,扭轉字時,它可以處理代替去除的連續空間:

提示是,在反向時包含那些額外的空格。

例如給定一個字符串

abc def  ghi 
L     (left)  

第一個反轉是微不足道的,所以我跳過它。該提示是,對於第二個字,你會第一個空間後立即停止將L的位置:

​​

反向的「右」側將是單詞的第一個右邊界:

cba def  ghi 
    L R 

然後做反向到位

cba fed  ghi 
    L R 

然後繼續尋找L的下一個位置開始反向再次:

cba fed  ghi 
     L 

採取類似的邏輯

cba fed  ghi 
     L  R 

然後

cba fed ihg  
     L  R 
1

一個非常,非常簡單的單行的解決辦法是使用REGEX (short for REGular EXpression)。我有兩種方法來做到這一點,我正在使用String#replaceAll()String#trim()方法。所以,這裏有雲:

String line = " Hello  World! "; 
line = line.replaceAll(" +", " "); // '+' = 1 or more i.e. at least 1. 
// Hence it replaces ALL white spaces with a single space. 
line = line.trim(); //This 'trims' the String to remove all leading and trailing 
// whitespaces. 
System.out.println(line); //Output: "Hello World!" 

更通行的做法是使用"\\s+",而不是" "。 (其實這個字符是\s,但是在String中存儲時應該使用雙斜線)。你仍然會得到相同的結果。您也可以嘗試使用Pattern - Matcher方法。