1. 程式人生 > 實用技巧 >力扣 上升下降字串

力扣 上升下降字串

題目描述如下:(無論是哪一道題,題目一定一定要認真看清楚!!)

給你一個字串s,請你根據下面的演算法重新構造字串:

從 s中選出 最小的字元,將它 接在結果字串的後面。
從 s剩餘字元中選出最小的字元,且該字元比上一個新增的字元大,將它 接在結果字串後面。
重複步驟 2 ,直到你沒法從 s中選擇字元。
從 s中選出 最大的字元,將它 接在結果字串的後面。
從 s剩餘字元中選出最大的字元,且該字元比上一個新增的字元小,將它 接在結果字串後面。
重複步驟 5,直到你沒法從 s中選擇字元。
重複步驟 1 到 6 ,直到 s中所有字元都已經被選過。
在任何一步中,如果最小或者最大字元不止一個,你可以選擇其中任意一個,並將其新增到結果字串。

請你返回將s中字元重新排序後的 結果字串 。

示例 1:

輸入:s = "aaaabbbbcccc"
輸出:"abccbaabccba"
解釋:第一輪的步驟 1,2,3 後,結果字串為 result = "abc"
第一輪的步驟 4,5,6 後,結果字串為 result = "abccba"
第一輪結束,現在 s = "aabbcc" ,我們再次回到步驟 1
第二輪的步驟 1,2,3 後,結果字串為 result = "abccbaabc"
第二輪的步驟 4,5,6 後,結果字串為 result = "abccbaabccba"
示例 2:

輸入:s = "rat"
輸出:"art"
解釋:單詞 "rat" 在上述演算法重排序以後變成 "art"
示例 3:

輸入:s = "leetcode"
輸出:"cdelotee"
示例 4:

輸入:s = "ggggggg"
輸出:"ggggggg"
示例 5:

輸入:s = "spo"
輸出:"ops"

提示:

1 <= s.length <= 500
s只包含小寫英文字母。

 1 char* sortString(char* s) {
 2     int num[26];                        // 定義陣列  0-25分別對應字母a-z  陣列中數字的大小對應字母出現的次數
 3     memset(num, 0, sizeof(num));                    //
初始化陣列num 4 int n = strlen(s); 5 for (int i = 0; i < n; i++) { //將原始陣列中的字母 轉化成num陣列中的數字 6 num[s[i] - 'a']++; 7 } 8 9 char* ret = malloc(sizeof(char) * (n + 1)); //定義最後輸出的陣列 10 int retSize = 0; 11 while (retSize < n) { 12 for (int i = 0; i < 26; i++) { //正著把應該輸入的字母 放到待輸出的陣列中 13 if (num[i]) { 14 ret[retSize++] = i + 'a'; 15 num[i]--; 16 } 17 } 18 for (int i = 25; i >= 0; i--) { //逆著 19 if (num[i]) { 20 ret[retSize++] = i + 'a'; 21 num[i]--; 22 } 23 } 24 } 25 ret[retSize] = 0; 26 return ret; 27 }

這個是我複製官方題解,看懂了寫下的註釋,因為是剛開始做,還是不太熟悉,我認真想了30分鐘,到中間不會了,然後看了題解,發現自己的思路還是太落後,所以我決定前期先慢慢摸索,等到可以20分鐘內有自己完全的解題能力了,再認真解答。