日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java LeetCode每日一题-从易到难带你领略算法的魅力(一):上升下降字符串

發布時間:2023/12/16 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java LeetCode每日一题-从易到难带你领略算法的魅力(一):上升下降字符串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上升下降字符串

    • 1.題目要求
    • 2.題目示例
    • 3.提示
    • 4.解題
      • 4.1 解題思路
      • 4.2 業務代碼
      • 4.3 運行結果
    • 5.優化
      • 5.1 優化思路
      • 5.2 優化業務代碼
      • 5.3 優化結果
    • 6.總結

1.題目要求

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

  • 從 s 中選出 最小 的字符,將它 接在 結果字符串的后面。
  • 從 s 剩余字符中選出 最小 的字符,且該字符比上一個添加的字符大,將它 接在 結果字符串后面。
  • 重復步驟 2 ,直到你沒法從 s 中選擇字符。
  • 從 s 中選出 最大 的字符,將它 接在 結果字符串的后面。
  • 從 s 剩余字符中選出 最大 的字符,且該字符比上一個添加的字符小,將它 接在 結果字符串后面。
  • 重復步驟 5 ,直到你沒法從 s 中選擇字符。
  • 重復步驟 1 到 6 ,直到 s 中所有字符都已經被選過。
  • 在任何一步中,如果最小或者最大字符不止一個 ,你可以選擇其中任意一個,并將其添加到結果字符串。
    請你返回將 s 中字符重新排序后的 結果字符串

    2.題目示例

    • 示例 1:
    輸入:s = "aaaabbbbcccc" 輸出:"abccbaabccba" 解釋:第一輪的步驟 123 后,結果字符串為 result = "abc" 第一輪的步驟 456 后,結果字符串為 result = "abccba" 第一輪結束,現在 s = "aabbcc" ,我們再次回到步驟 1 第二輪的步驟 123 后,結果字符串為 result = "abccbaabc" 第二輪的步驟 456 后,結果字符串為 result = "abccbaabccba"
    • 示例 2:
    輸入:s = "rat" 輸出:"art" 解釋:單詞 "rat" 在上述算法重排序以后變成 "art"
    • 示例 3:
    輸入:s = "leetcode" 輸出:"cdelotee"
    • 示例 4:
    輸入:s = "ggggggg" 輸出:"ggggggg"
    • 示例 5:
    輸入:s = "spo" 輸出:"ops"

    3.提示

    • 1 <= s.length <= 500
    • s 只包含小寫英文字母。
    • Count the frequency of each character.
      計算每個字符的頻率。
    • Loop over all character from ‘a’ to ‘z’ and append the character if it exists and decrease frequency by 1. Do the same from ‘z’ to ‘a’.
      循環遍歷從“a”到“z”的所有字符,如果該字符存在,則追加該字符,并將頻率降低1。從“z”到“a”做同樣的事情。
    • Keep repeating until the frequency of all characters is zero.
      一直重復,直到所有字符的頻率為零。

    4.解題

    4.1 解題思路

    在看完題目過后:

    • 提取關鍵信息
  • 每個字符只能使用一次
  • 每一輪都會在返回字符串后增加一個先升后降的字符串
  • 處理數據時,無需關注數據在原字符串中的位置
    • 具體思路
  • 創建一個容量為26的int數組每個數組的位置對應一個字母,其后把傳入的string變為char類型循環遍歷,得到一個記錄著每個字母有多少個的“映射”int數組
  • 使用 StringBuilder 來存放拼接的返回字符串
  • 使用while循環,循環里包含兩個for循環,前一個用來拼接升的字符串,后一個用來拼接降的字符串,每使用一個字母就在“映射”數組對應的位置,把計數減一,直到 StringBuilder 的長度和傳入的字符串的長度相等
  • 4.2 業務代碼

    class Solution {public String sortString(String s) {int[] num = new int[26];for (int i = 0; i < s.length(); i++) {num[s.charAt(i) - 'a']++;}StringBuffer sb = new StringBuffer();while (sb.length() < s.length()) {for (int i = 0; i < 26; i++) {if (num[i] > 0) {sb.append((char) (i + 'a'));num[i]--;}}for (int i = 25; i >= 0; i--) {if (num[i] > 0) {sb.append((char) (i + 'a'));num[i]--;}}}return sb.toString();} }

    4.3 運行結果

    5.優化

    5.1 優化思路

    不使用 StringBuilder 而是使用char類型的數組來存儲會不會有奇效
    但是使用數組來作為存儲媒介的話while的判斷就需要另外的值來表示char已經插入了多少數據

    5.2 優化業務代碼

    class Solution {public String sortString(String s) {int[] num = new int[26];for (int i = 0; i < s.length(); i++) {num[s.charAt(i) - 'a']++;}char[] res = new char[s.length()];int index = 0;while (index < s.length()) {for (int i = 0; i < 26; i++) {if (num[i] != 0) {res[index++] = (char) (i + 'a');num[i]--;}}for (int i = 25; i >= 0; i--) {if (num[i] != 0) {res[index++] = (char) (i + 'a');num[i]--;}}}return new String(res);} }

    5.3 優化結果

    6.總結

    作為力扣系列的第一天,到最后也只是優化了0.2MB的內存空間出來,還是有點小傷心的。如果大家有更好的解決方案可以直接在下面留言。

    總結

    以上是生活随笔為你收集整理的Java LeetCode每日一题-从易到难带你领略算法的魅力(一):上升下降字符串的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。