1. 程式人生 > >程式設計師程式設計藝術-----第二十七章-----不改變正負數相對順序重新排列陣列

程式設計師程式設計藝術-----第二十七章-----不改變正負數相對順序重新排列陣列

10、翻轉句子中單詞的順序。
題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。例如輸入“I am a student.”,則輸出“student. a am I”。而此題可以在O(N)的時間複雜度內解決

    由於本題需要翻轉句子,我們先顛倒句子中的所有字元。這時,不但翻轉了句子中單詞的順序,而且單詞內字元也被翻轉了。我們再顛倒每個單詞內的字元。由於單詞內的字元被翻轉兩次,因此順序仍然和輸入時的順序保持一致。
    以上面的輸入為例:翻轉“I am a student.”中所有字元得到“.tneduts a ma I”,再翻轉每個單詞中字元的順序得到“students. a am I”,正是符合要求的輸出(編碼實現,可以參看此文:

http://zhedahht.blog.163.com/blog/static/254111742007289205219/)。

    對的,上述思路3就是這個意思,單詞翻轉便相當於於區間翻轉,既如此,咱們來驗證下上述思路2中那個測試用例,如下:

1, 7, -5, -6, 9-12, 15
1 7 -5 -6 -12 9 15
-12 -6 -5 7 1 9 15   (借用單詞翻轉的方法,先逐個數字翻轉,後正負數整體原地翻轉)
-5 -6 -12 1 7 9 15

思路5再次被質疑

    但是,我還想再問,問題至此被解決了麼?真的被KO了麼?NO,咱們來看這樣一種情況,正如威士忌所說:

看看這個資料,+-+-+-+-+------+,假如Nminus 等於 n/2,由於前面都是+-+-+-,區間交換需要 n/2/2 = n/4次,每次交換是 T(2*(Nminus + Nplus)) >= T(n),n/4 * T(n) = T(n*n/4)=O(n^2)。

    還有一種更壞的情況,就是+-+-+-+-+------+這種資料可能,後面一大堆的負數,前面正負交替。所以,咱們的美夢再次破滅,路漫漫其修遠兮,此題仍然未找到一個完全解決了的方案。