1370. 上升下降字符串『简单』
题目来源于力扣(LeetCode)
一、题目
题目相关标签:排序、字符串
说明:
1 <= s.length <= 500
s
只包含小写英文字母。
二、解题思路
-
创建 26 个长度的 int 数组,用于映射 26 个小写字母出现的次数
-
遍历字符数组 arr(由字符串 s 转换而来),通过哈希数组记录下每个字符出现的次数
-
据题意:当哈希数组中次数的和大于 0 时,循环进行字符的添加
循环操作的步骤:
-
正序遍历一次,每次遍历时,往结果集数组中添加元素,并对哈希数组中的次数减 1
-
倒序遍历一次,每次遍历时,往结果集数组中添加元素,并对哈希数组中的次数减 1
-
-
当哈希数组中的元素都为 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);
}