<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)151:翻轉(zhuǎn)字符串里的單詞

          共 2101字,需瀏覽 5分鐘

           ·

          2021-01-14 14:27

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做?翻轉(zhuǎn)字符串里的單詞,我們先來看題面:
          https://leetcode-cn.com/problems/reverse-words-in-a-string/

          Given an input string s, reverse the order of the words.


          A word is defined as a sequence of non-space characters. The words in s will be separated by at least one space.


          Return a string of the words in reverse order concatenated by a single space.


          Note that s may contain leading or trailing spaces or multiple spaces between two words. The returned string should only have a single space separating the words. Do not include any extra spaces.

          題意


          給定一個(gè)字符串,逐個(gè)翻轉(zhuǎn)字符串中的每個(gè)單詞。

          說明:

          • 無空格字符構(gòu)成一個(gè) 單詞 。

          • 輸入字符串可以在前面或者后面包含多余的空格,但是反轉(zhuǎn)后的字符不能包括。

          • 如果兩個(gè)單詞間有多余的空格,將反轉(zhuǎn)后單詞間的空格減少到只含一個(gè)。


          樣例

          示例 1

          輸入:"the sky is blue"
          輸出:"blue is sky the"

          示例 2

          輸入:" ?hello world! ?"
          輸出:"world! hello"
          解釋:輸入字符串可以在前面或者后面包含多余的空格,但是反轉(zhuǎn)后的字符不能包括。

          示例 3

          輸入:"a good ? example"
          輸出:"example good a"
          解釋:如果兩個(gè)單詞間有多余的空格,將反轉(zhuǎn)后單詞間的空格減少到只含一個(gè)。

          示例 4

          輸入:s = " Bob Loves Alice "
          輸出:"Alice Loves Bob"

          示例 5

          輸入:s = "Alice does not even like bob"
          輸出:"bob like even not does Alice"


          解題

          https://blog.csdn.net/weixin_43314519/article/details/107444407

          方法一:使用語言特性

          思路和算法

          很多語言對(duì)字符串提供了?split(拆分),reverse(翻轉(zhuǎn))和?join(連接)等方法,因此我們可以簡(jiǎn)單的調(diào)用內(nèi)置的 API 完成操作:

          1. 使用?split?將字符串按空格分割成字符串?dāng)?shù)組;

          2. 使用?reverse?將字符串?dāng)?shù)組進(jìn)行反轉(zhuǎn);

          3. 使用?join?方法將字符串?dāng)?shù)組拼成一個(gè)字符串。

          class?Solution {
          ????public?String?reverseWords(String?s) {
          ????????// 除去開頭和末尾的空白字符
          ????????s = s.trim();
          ????????// 正則匹配連續(xù)的空白字符作為分隔符分割
          ????????List<String> wordList = Arrays.asList(s.split("\\s+"));
          ????????Collections.reverse(wordList);
          ????????return?String.join(" ", wordList);
          ????}
          }


          復(fù)雜度分析
          • 時(shí)間復(fù)雜度:O(N),其中 N 為輸入字符串的長(zhǎng)度。

          • 空間復(fù)雜度:O(N),用來存儲(chǔ)字符串分割之后的結(jié)果。


          方法二:自行編寫對(duì)應(yīng)的函數(shù)

          思路和算法
          我們也可以不使用語言中的 API,而是自己編寫對(duì)應(yīng)的函數(shù)。在不同語言中,這些函數(shù)實(shí)現(xiàn)是不一樣的,主要的差別是有些語言的字符串不可變(如 Java 和 Python),有些語言的字符串可變(如 C++)。
          對(duì)于字符串不可變的語言,首先得把字符串轉(zhuǎn)化成其他可變的數(shù)據(jù)結(jié)構(gòu),同時(shí)還需要在轉(zhuǎn)化的過程中去除空格。
          對(duì)于字符串可變的語言,就不需要再額外開辟空間了,直接在字符串上原地實(shí)現(xiàn)。在這種情況下,反轉(zhuǎn)字符和去除空格可以一起完成。

          class?Solution?{
          ????public?StringBuilder trimSpaces(String s)?{
          ????????int?left = 0, right = s.length() - 1;
          ????????// 去掉字符串開頭的空白字符
          ????????while?(left <= right && s.charAt(left) == ' ') ++left;

          ????????// 去掉字符串末尾的空白字符
          ????????while?(left <= right && s.charAt(right) == ' ') --right;

          ????????// 將字符串間多余的空白字符去除
          ????????StringBuilder sb = new?StringBuilder();
          ????????while?(left <= right) {
          ????????????char?c = s.charAt(left);

          ????????????if?(c != ' ') sb.append(c);
          ????????????else?if?(sb.charAt(sb.length() - 1) != ' ') sb.append(c);

          ????????????++left;
          ????????}
          ????????return?sb;
          ????}

          ????public?void?reverse(StringBuilder sb, int?left, int?right)?{
          ????????while?(left < right) {
          ????????????char?tmp = sb.charAt(left);
          ????????????sb.setCharAt(left++, sb.charAt(right));
          ????????????sb.setCharAt(right--, tmp);
          ????????}
          ????}

          ????public?void?reverseEachWord(StringBuilder sb)?{
          ????????int?n = sb.length();
          ????????int?start = 0, end = 0;

          ????????while?(start < n) {
          ????????????// 循環(huán)至單詞的末尾
          ????????????while?(end < n && sb.charAt(end) != ' ') ++end;
          ????????????// 翻轉(zhuǎn)單詞
          ????????????reverse(sb, start, end - 1);
          ????????????// 更新start,去找下一個(gè)單詞
          ????????????start = end + 1;
          ????????????++end;
          ????????}
          ????}

          ????public?String reverseWords(String s)?{
          ????????StringBuilder sb = trimSpaces(s);

          ????????// 翻轉(zhuǎn)字符串
          ????????reverse(sb, 0, sb.length() - 1);

          ????????// 翻轉(zhuǎn)每個(gè)單詞
          ????????reverseEachWord(sb);

          ????????return?sb.toString();
          ????}
          }

          復(fù)雜度分析
          • 時(shí)間復(fù)雜度:O(N),其中 N 為輸入字符串的長(zhǎng)度。

          • 空間復(fù)雜度:Java?和?Python?的方法需要 O(N)O(N) 的空間來存儲(chǔ)字符串,而?C++?方法只需要?O(1)?的額外空間來存放若干變量。

          方法三:雙端隊(duì)列

          思路和算法
          由于雙端隊(duì)列支持從隊(duì)列頭部插入的方法,因此我們可以沿著字符串一個(gè)一個(gè)單詞處理,然后將單詞壓入隊(duì)列的頭部,再將隊(duì)列轉(zhuǎn)成字符串即可。

          class?Solution?{
          ????public?String reverseWords(String s) {
          ????????int?left = 0, right = s.length() - 1;
          ????????// 去掉字符串開頭的空白字符
          ????????while?(left <= right && s.charAt(left) == ' ') ++left;

          ????????// 去掉字符串末尾的空白字符
          ????????while?(left <= right && s.charAt(right) == ' ') --right;

          ????????Deque d = new?ArrayDeque();
          ????????StringBuilder word = new?StringBuilder();
          ????????
          ????????while?(left <= right) {
          ????????????char?c = s.charAt(left);
          ????????????if?((word.length() != 0) && (c == ' ')) {
          ????????????????// 將單詞 push 到隊(duì)列的頭部
          ????????????????d.offerFirst(word.toString());
          ????????????????word.setLength(0);
          ????????????} else?if?(c != ' ') {
          ????????????????word.append(c);
          ????????????}
          ????????????++left;
          ????????}
          ????????d.offerFirst(word.toString());

          ????????return?String.join(" ", d);
          ????}
          }

          復(fù)雜度分析
          • 時(shí)間復(fù)雜度:O(N),其中 N 為輸入字符串的長(zhǎng)度。

          • 空間復(fù)雜度:O(N),雙端隊(duì)列存儲(chǔ)單詞需要 O(N) 的空間。


          好了,今天的文章就到這里,如果覺得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力。

          上期推文:

          LeetCode1-140題匯總,希望對(duì)你有點(diǎn)幫助!
          LeetCode刷題實(shí)戰(zhàn)141:環(huán)形鏈表
          LeetCode刷題實(shí)戰(zhàn)142:環(huán)形鏈表 II
          LeetCode刷題實(shí)戰(zhàn)143:重排鏈表
          LeetCode刷題實(shí)戰(zhàn)144:二叉樹的前序遍歷
          LeetCode刷題實(shí)戰(zhàn)145:二叉樹的后序遍歷
          LeetCode刷題實(shí)戰(zhàn)146:LRU 緩存機(jī)制
          LeetCode刷題實(shí)戰(zhàn)147:對(duì)鏈表進(jìn)行插入排序
          LeetCode刷題實(shí)戰(zhàn)148:排序鏈表
          LeetCode刷題實(shí)戰(zhàn)149:直線上最多的點(diǎn)數(shù)
          LeetCode刷題實(shí)戰(zhàn)150:逆波蘭表達(dá)式求值


          瀏覽 23
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本伦理一区二区三区 | 国产福利视频导航 | 国产熟妇疯狂性做爰XXXⅩ网站 | 91成人18 | 手机看片日 |