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);
}
posted @ 2020-05-28 21:29  知音12138  阅读(239)  评论(0编辑  收藏  举报