1. 程式人生 > >leetcode-557-Reverse Words in a String III

leetcode-557-Reverse Words in a String III

span leet note col 函數 交換 處理 ats enc

題目描述:

Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order.

Example 1:

Input: "Let‘s take LeetCode contest"
Output: "s‘teL ekat edoCteeL tsetnoc"

Note: In the string, each word is separated by single space and there will not be any extra space in the string.

要完成的函數:

string reverseWords(string s)

說明:

1、這道題目不難,找到空格的位置,然後把空格前的單詞做個反轉,一直處理到最後碰到‘\0‘。

2、考慮一下全過程,定義兩個位置index,一個記錄起始位置i,一個一直循環直到遇到空格,記錄空格符前一位的位置j。然後在i和j之間做一個反轉,直接在字符串上實現就好了。

j一直循環下去,不斷+1,直到碰到下一個空格字符。繼續這樣子處理。

直到最後j不會小於string的長度,這時候退出循環,返回原本字符串就可以了。

代碼如下:

    string reverseWords(string s) 
    {
        
int i=0,j=0,t1; char t;//交換字母的臨時變量 int s1=s.size(); while(j<s1) { while(s[j]!= &&j<s1) j++; t1=j+1;//下一個單詞開始的地方 j--;//空格前一個字符 while(i<j) { t=s[i]; s[i]
=s[j]; s[j]=t; i++; j--; } i=t1;//更新i到下一個單詞的首字母位置 j=t1+1;//j依然在i的下一位 } return s; }

上述代碼實測25ms,beats 52.53% of cpp submissions。

3、改進:

在討論區中看到有人使用了reverse函數,測試了一下,就變成了beats 98.76%……

同樣分享給大家,代碼如下:

    string reverseWords(string s) 
    {
        int i=0,j=0,t1;
        char t;
        int s1=s.size();
        while(j<s1)
        {
            while(s[j]!= &&j<s1)
                j++;
            reverse(&s[i], &s[j]);
            i=j+1;//i更新到下一個單詞的首位
            j=i+1;//j在i的下一位
        }
        return s;
    }

上述代碼實測22ms,beats 98.76% of cpp submissions。

花費時間變少了,可能是因為reverse函數被優化了?筆者其實覺得2中的代碼已經算是很高效的了,想不出有哪裏還可以繼續改進……希望知道怎麽改進的同學不吝賜教。

leetcode-557-Reverse Words in a String III