最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)LeetCode(151.翻轉(zhuǎn)字符串中的單詞)

 更新時間:2021年07月29日 14:34:45   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(151.翻轉(zhuǎn)字符串中的單詞),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 151.Reverse Words in a String 翻轉(zhuǎn)字符串中的單詞

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".

Update (2015-02-12):
For C programmers: Try to solve it in-place in O(1) space.

click to show clarification.

Clarification:

  • What constitutes a word?
    A sequence of non-space characters constitutes a word.
  • Could the input string contain leading or trailing spaces?
    Yes. However, your reversed string should not contain leading or trailing spaces.
  • How about multiple spaces between two words?
    Reduce them to a single space in the reversed string.

這道題讓我們翻轉(zhuǎn)字符串中的單詞,題目中給了我們寫特別說明,如果單詞之間遇到多個空格,只能返回一個,而且首尾不能有單詞,并且對C語言程序員要求空間復(fù)雜度為O(1),所以我們只能對原字符串s之間做修改,而不能聲明新的字符串。那么我們?nèi)绾畏D(zhuǎn)字符串中的單詞呢,我們的做法是,先整個字符串整體翻轉(zhuǎn)一次,然后再分別翻轉(zhuǎn)每一個單詞(或者先分別翻轉(zhuǎn)每一個單詞,然后再整個字符串整體翻轉(zhuǎn)一次),此時就能得到我們需要的結(jié)果了。那么這里我們需要定義一些變量來輔助我們解題,storeIndex表示當(dāng)前存儲到的位置,n為字符串的長度。我們先給整個字符串反轉(zhuǎn)一下,然后我們開始循環(huán),遇到空格直接跳過,如果是非空格字符,我們此時看storeIndex是否為0,為0的話表示第一個單詞,不用增加空格;如果不為0,說明不是第一個單詞,需要在單詞中間加一個空格,然后我們要找到下一個單詞的結(jié)束位置我們用一個while循環(huán)來找下一個為空格的位置,在此過程中繼續(xù)覆蓋原字符串,找到結(jié)束位置了,下面就來翻轉(zhuǎn)這個單詞,然后更新i為結(jié)尾位置,最后遍歷結(jié)束,我們剪裁原字符串到storeIndex位置,就可以得到我們需要的結(jié)果,代碼如下:

C++ 解法一:

class Solution {
public:
    void reverseWords(string &s) {
        int storeIndex = 0, n = s.size();
        reverse(s.begin(), s.end());
        for (int i = 0; i < n; ++i) {
            if (s[i] != ' ') {
                if (storeIndex != 0) s[storeIndex++] = ' ';
                int j = i;
                while (j < n && s[j] != ' ') s[storeIndex++] = s[j++];
                reverse(s.begin() + storeIndex - (j - i), s.begin() + storeIndex);
                i = j;
            }
        }
        s.resize(storeIndex);
    }
};

Java解法一:

public class Solution {
    public String reverseWords(String s) {
        int storeIndex = 0, n = s.length();
        StringBuilder sb = new StringBuilder(s).reverse();
        for (int i = 0; i < n; ++i) {
            if (sb.charAt(i) != ' ') {
                if (storeIndex != 0) sb.setCharAt(storeIndex++, ' ');
                int j = i;
                while (j < n && sb.charAt(j) != ' ') sb.setCharAt(storeIndex++, sb.charAt(j++));
                String t = new StringBuilder(sb.substring(storeIndex - (j - i), storeIndex)).reverse().toString();
                sb.replace(storeIndex - (j - i), storeIndex, t);
                i = j;
            }
        }
        sb.setLength(storeIndex);
        return sb.toString();
    }
}

下面我們來看使用字符串流類stringstream的解法,我們先把字符串裝載入字符串流中,然后定義一個臨時變量tmp,然后把第一個單詞賦給s,這里需要注意的是,如果含有非空格字符,那么每次>>操作就會提取連在一起的非空格字符,那么我們每次將其加在s前面即可;如果原字符串為空,那么就不會進(jìn)入while循環(huán);如果原字符串為許多空格字符連在一起,那么第一個>>操作就會提取出這些空格字符放入s中,然后不進(jìn)入while循環(huán),這時候我們只要判斷一下s的首字符是否為空格字符,是的話就將s清空即可,參見代碼如下:

C++ 解法二:

class Solution {
public:
    void reverseWords(string &s) {
        istringstream is(s);
        string tmp;
        is >> s;
        while(is >> tmp) s = tmp + " " + s;
        if(!s.empty() && s[0] == ' ') s = "";
    }
};

下面這種方法也是使用stringstream來做,但是我們使用了getline來做,第三個參數(shù)是設(shè)定分隔字符,我們用空格字符來分隔,這個跟上面的>>操作是有不同的,每次只能過一個空格字符,如果有多個空格字符連在一起,那么t會賦值為空字符串,所以我們在處理t的時候首先要判斷其是否為空,是的話直接跳過,參見代碼如下:

C++ 解法三:

class Solution {
public:
    void reverseWords(string &s) {
        istringstream is(s);
        s = "";
        string t = "";
        while (getline(is, t, ' ')) {
            if (t.empty()) continue;
            s = (s.empty() ? t : (t + " " + s));
        }
    }
};

而如果我們使用Java的String的split函數(shù)來做的話就非常簡單了,沒有那么多的幺蛾子,簡單明了,我們首先將原字符串調(diào)用trim()來去除冗余空格,然后調(diào)用split()來分隔,分隔符設(shè)為"\\s+",這其實是一個正則表達(dá)式,\\s表示空格字符,+表示可以有一個或多個空格字符,那么我們就可以把單詞分隔開裝入一個字符串?dāng)?shù)組中,然后我們從末尾開始,一個個把單詞取出來加入結(jié)果res中,并且單詞之間加上空格字符,注意我們把第一個單詞留著不取,然后返回的時候再加上即可,參見代碼如下:

Java解法二:

public class Solution {
    public String reverseWords(String s) {
        String res = "";
        String[] words = s.trim().split("\\s+");
        for (int i = words.length - 1; i > 0; --i) {
            res += words[i] + " ";   
        }
        return res + words[0];
    }
}

下面這種方法就更加的簡單了,瘋狂的利用到了Java的內(nèi)置函數(shù),這也是Java的強(qiáng)大之處,注意這里的分隔符沒有用正則表達(dá)式,而是直接放了個空格符進(jìn)去,后面還是有+號,跟上面的寫法得到的效果是一樣的,然后我們對字符串?dāng)?shù)組進(jìn)行翻轉(zhuǎn),然后調(diào)用join()函數(shù)來把字符串?dāng)?shù)組拼接成一個字符串,中間夾上空格符即可,參見代碼如下:

Java解法三:

public class Solution {
    public String reverseWords(String s) {
        String[] words = s.trim().split(" +");
        Collections.reverse(Arrays.asList(words));
        return String.join(" ", words);
    }
}

類似題目:

Reverse Words in a String II 

參考資料:

https://discuss.leetcode.com/topic/3298/in-place-simple-solution

https://discuss.leetcode.com/topic/2742/my-accepted-java-solution

https://discuss.leetcode.com/topic/11785/java-3-line-builtin-solution

https://discuss.leetcode.com/topic/10199/5-lines-c-using-stringstream

到此這篇關(guān)于C++實現(xiàn)LeetCode(151.翻轉(zhuǎn)字符串中的單詞)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)翻轉(zhuǎn)字符串中的單詞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)按行讀寫文件

    C語言實現(xiàn)按行讀寫文件

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)按行讀寫文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C/C++詳解如何實現(xiàn)文件備份

    C/C++詳解如何實現(xiàn)文件備份

    這篇文章主要介紹了C/C++詳解如何實現(xiàn)文件備份,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • c語言內(nèi)存泄露示例解析

    c語言內(nèi)存泄露示例解析

    從1988年著名的莫里斯蠕蟲 攻擊到有關(guān) Flash Player 和其他關(guān)鍵的零售級程序的最新安全警報都與緩沖區(qū)溢出有關(guān):“大多數(shù)計算機(jī)安全漏洞都是緩沖區(qū)溢出”,Rodney Bates 在 2004 年寫道
    2013-09-09
  • 減少OpenCV讀取高分辨率圖像的時間示例

    減少OpenCV讀取高分辨率圖像的時間示例

    今天小編就為大家分享一篇減少OpenCV讀取高分辨率圖像的時間示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言單鏈表實現(xiàn)通訊錄管理系統(tǒng)

    C語言單鏈表實現(xiàn)通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言單鏈表實現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C語言文件操作詳解以及詳細(xì)步驟

    C語言文件操作詳解以及詳細(xì)步驟

    文件(file)一般指存儲在外部介質(zhì)上數(shù)據(jù)的集合,比如我們經(jīng)常使用的.txt,?.bmp,?jpg.?.exe,.rmvb等等,下面這篇文章主要給大家介紹了關(guān)于C語言文件操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 探討++i與i++哪個效率更高

    探討++i與i++哪個效率更高

    i++總是要創(chuàng)建一個臨時對象,在退出函數(shù)時還要銷毀它,而且返回臨時對象的值時還會調(diào)用其拷貝構(gòu)造函數(shù)
    2013-10-10
  • C++實現(xiàn)簡易文本編輯器

    C++實現(xiàn)簡易文本編輯器

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡易文本編輯器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++泛型算法的一些總結(jié)

    C++泛型算法的一些總結(jié)

    以下是對C++中的泛型算法進(jìn)行了總結(jié)介紹。需要的朋友可以過來參考下
    2013-08-08
  • VC++實現(xiàn)文件與應(yīng)用程序關(guān)聯(lián)的方法(注冊表修改)

    VC++實現(xiàn)文件與應(yīng)用程序關(guān)聯(lián)的方法(注冊表修改)

    這篇文章主要介紹了VC++實現(xiàn)文件與應(yīng)用程序關(guān)聯(lián)的方法,涉及VC++針對注冊表的相關(guān)操作技巧,需要的朋友可以參考下
    2016-08-08

最新評論

洪江市| 中超| 余江县| 绥棱县| 扶余县| 扶沟县| 朝阳县| 吉安县| 武穴市| 潍坊市| 文成县| 潢川县| 土默特左旗| 咸阳市| 延边| 惠水县| 杂多县| 浙江省| 上杭县| 通河县| 南川市| 建平县| 尼玛县| 铜山县| 红桥区| 长海县| 石台县| 当阳市| 盐亭县| 柏乡县| 汨罗市| 大洼县| 遵义市| 滦平县| 商水县| 新巴尔虎左旗| 凭祥市| 民县| 句容市| 义马市| 布尔津县|