151. 反轉(zhuǎn)字符串中的單詞

給你一個字符串 s 阶剑,請你反轉(zhuǎn)字符串中 單詞 的順序(單詞本身不反轉(zhuǎn),單詞間的反轉(zhuǎn))危号。
單詞 是由非空格字符組成的字符串牧愁。s 中使用至少一個空格將字符串中的 單詞 分隔開。
返回 單詞 順序顛倒且 單詞 之間用單個空格連接的結(jié)果字符串外莲。
注意:輸入字符串 s中可能會存在前導(dǎo)空格猪半、尾隨空格或者單詞間的多個空格。返回的結(jié)果字符串中偷线,單詞間應(yīng)當(dāng)僅用單個空格分隔磨确,且不包含任何額外的空格。
● 進階:嘗試使用O(1)額外空間復(fù)雜度的原地解法声邦。

\color{purple}{由于Java輸入的是String乏奥,為不可變的數(shù)據(jù)類型,我們將其轉(zhuǎn)換為char[]翔忽,進行進階解答英融。}

解題思路:
(1) 最簡單的想法就是:先對字符串去除前后空格,然后使用一個StringBuilder對象(sb)歇式,從后往前遍歷String,找到一個單詞(雙指針劃定)后就追加到sb中胡野。

class Solution {
    public String reverseWords(String s) {
        s = s.trim();
        StringBuilder sb = new StringBuilder();
        int i = s.length()-1;
        int j = i;
        while(i >= 0){
            // 找下一個單詞的末尾
            while(s.charAt(i) == ' ') i--;
            j = i;
            // 找下一個單詞的頭
            while((i-1) >= 0 && s.charAt(i-1) != ' ') i--;
            sb.append(s.substring(i, j+1));
            sb.append(" ");
            i--;
        }
        return sb.substring(0, sb.length()-1).toString();
    }
}

(2) 進階的解法:【不使用任何庫函數(shù)的基礎(chǔ)上】消除多余空格+整體反轉(zhuǎn)+單詞反轉(zhuǎn)材失。?
● 消除多余空格:同向雙指針×蚨梗【類似:代碼隨想錄-移除元素
● 整體反轉(zhuǎn):相向雙指針【類似:代碼隨想錄-反轉(zhuǎn)字符串
● 單詞反轉(zhuǎn):(同整體反轉(zhuǎn)龙巨,這里是局部反轉(zhuǎn)) 相向雙指針

class Solution {
    public String reverseWords(String s) {
        // 先將String轉(zhuǎn)化成char[]
        char[] s_char = s.toCharArray();
        // 1笼呆、消除多余空格
        int i = 0;
        int j = 0;
        while(j < s_char.length){
            if(s_char[j] != ' ') s_char[i++] = s_char[j++];
            else{
                // 遇到空格了,找到最右邊的空格
                while((j+1) < s_char.length && s_char[j] == s_char[j+1]) j++;
                if(j == s_char.length-1) break; // 末尾的空格
                if(i > 0) s_char[i++] = s_char[j++]; // 中間的空格
                else j++; // 開頭的空格
            }
        }
        // 此時i就是有效的s_char長度
        int len = i;
        j = i - 1;
        i = 0;
        // 2旨别、利用雙指針诗赌,將整個字符數(shù)組反轉(zhuǎn)
        reverseArrayByIndex(s_char, i, j);
        // 3、找到每個單詞進行反轉(zhuǎn)
        i = 0;
        j = 0;
        while(j < len){
            // 找到單詞的尾
            while((j+1) < len && s_char[j+1] != ' ') j++;
            reverseArrayByIndex(s_char, i, j);
            i = j + 2;
            j = i;
        }
        return new String(s_char).substring(0, len);
    }
    public void reverseArrayByIndex(char[] arr, int i, int j){
        while(i < j){
            char c = arr[i];
            arr[i] = arr[j];
            arr[j] = c;
            i++;
            j--;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秸弛,一起剝皮案震驚了整個濱河市铭若,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌递览,老刑警劉巖叼屠,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绞铃,居然都是意外死亡镜雨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門儿捧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荚坞,“玉大人,你說我怎么就攤上這事菲盾⊥怯埃” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵亿汞,是天一觀的道長瞭空。 經(jīng)常有香客問我,道長疗我,這世上最難降的妖魔是什么咆畏? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮吴裤,結(jié)果婚禮上旧找,老公的妹妹穿的比我還像新娘。我一直安慰自己麦牺,他們只是感情好钮蛛,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剖膳,像睡著了一般魏颓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吱晒,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天甸饱,我揣著相機與錄音,去河邊找鬼。 笑死叹话,一個胖子當(dāng)著我的面吹牛偷遗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驼壶,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼氏豌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了热凹?” 一聲冷哼從身側(cè)響起泵喘,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碌嘀,沒想到半個月后涣旨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡股冗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年霹陡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片止状。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡烹棉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怯疤,到底是詐尸還是另有隱情浆洗,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布集峦,位于F島的核電站伏社,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏塔淤。R本人自食惡果不足惜暮蹂,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一烦周、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忍饰,春花似錦浓体、人聲如沸缓待。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至露泊,卻和暖如春喉镰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惭笑。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工梧喷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脖咐。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓铺敌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屁擅。 傳聞我的和親對象是個殘疾皇子偿凭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容