zoukankan      html  css  js  c++  java
  • 1370. 上升下降字符串『简单』

    题目来源于力扣(LeetCode

    一、题目

    1370. 上升下降字符串

    题目相关标签:排序、字符串

    说明:

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

    二、解题思路

    1. 创建 26 个长度的 int 数组,用于映射 26 个小写字母出现的次数

    2. 遍历字符数组 arr(由字符串 s 转换而来),通过哈希数组记录下每个字符出现的次数

    3. 据题意:当哈希数组中次数的和大于 0 时,循环进行字符的添加

      循环操作的步骤:

      1. 正序遍历一次,每次遍历时,往结果集数组中添加元素,并对哈希数组中的次数减 1

      2. 倒序遍历一次,每次遍历时,往结果集数组中添加元素,并对哈希数组中的次数减 1

    4. 哈希数组中的元素都为 0 时,或者记录字符串长度的变量 len 小于等于 0 时,结束循环

    三、代码实现

    public static String sortString(String s) {
        char[] arr = s.toCharArray();
        int len = arr.length;
        // 使用字符数组存储来代替 StringBuilder
        char[] ans = new char[len];
    
        int[] map = new int[26];
        // 将字母字符出现的次数映射到哈希数组中,索引表示字母,值表示出现次数
        for (int i = 0; i < len; i++) {
            map[arr[i] - 'a'] += 1;
        }
        // 记录字符数组 ans 的索引
        int j = 0;
        // 遍历字符串直到记录的长度为 0,即 map 中的值均为 0 时
        // 即实现不停上升和下降的排列,直到长度为 0
        while (len > 0) {
            // 正序遍历:上升
            for (int i = 0; i < map.length; i++) {
                if (map[i] > 0) {
                    ans[j++] = (char) (i + 'a');
                    map[i] -= 1;
                    len -= 1;
                }
            }
            // 倒序遍历:下降
            for (int i = map.length - 1; i >= 0; i--) {
                if (map[i] > 0) {
                    ans[j++] = (char) (i + 'a');
                    map[i] -= 1;
                    len -= 1;
                }
            }
        }
        // 返回字符串结果
        return String.valueOf(ans);
    }
    

    四、执行用时

    五、部分测试用例

    public static void main(String[] args) {
        String s = "aaaabbbbcccc";  // output:"abccbaabccba"
    //    String s = "rat";  // output:"art"
    //    String s = "leetcode";  // output:"cdelotee"
    //    String s = "ggggggg";  // output:"ggggggg"
    //    String s = "spo";  // output:"ops"
        
        String result = sortString(s);
        System.out.println(result);
    }
    
  • 相关阅读:
    Go-闭包
    GO-数组与切片
    Go-包
    Go-for循环
    GO-逻辑判断(if,else if,else,switch)
    前后端分离的思考与实践(六)
    前后端分离的思考与实践(五)
    前后端分离的思考与实践(三)
    前后端分离的思考与实践(二)
    前后端分离的思考与实践(一)
  • 原文地址:https://www.cnblogs.com/zhiyin1209/p/12984080.html
Copyright © 2011-2022 走看看