本文主要是介绍关于上升下降字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
import java.util.*;class Solution {public String sortString(String s) {// 用 TreeMap 存储字符及其出现次数TreeMap<Character, Integer> map = new TreeMap<>();for (char c : s.toCharArray()) {map.put(c, map.getOrDefault(c, 0) + 1);}StringBuilder result = new StringBuilder();// 循环直到所有字符都被选过while (!map.isEmpty()) {// 选择最小的字符,并依次选择比它大的字符for (Iterator<Map.Entry<Character, Integer>> it = map.entrySet().iterator(); it.hasNext();) {Map.Entry<Character, Integer> entry = it.next();result.append(entry.getKey());if (entry.getValue() == 1) {it.remove();} else {entry.setValue(entry.getValue() - 1);}}// 选择最大的字符,并依次选择比它小的字符for (Iterator<Map.Entry<Character, Integer>> it = map.descendingMap().entrySet().iterator(); it.hasNext();) {Map.Entry<Character, Integer> entry = it.next();result.append(entry.getKey());if (entry.getValue() == 1) {it.remove();} else {entry.setValue(entry.getValue() - 1);}}}return result.toString();}
}
代码详细解释
-
导入所需包
import java.util.*;
java.util.*
包含了我们使用的所有集合类,包括TreeMap
和Iterator
。
-
定义类和方法
class Solution {public String sortString(String s) {
Solution
类定义了我们的解决方案。sortString
方法接受一个字符串s
作为输入并返回重新排序后的字符串。
-
初始化
TreeMap
TreeMap<Character, Integer> map = new TreeMap<>();
TreeMap
是一个有序的Map
,按键的自然顺序排序。在这里,我们用它来存储字符及其出现的次数。
-
填充
TreeMap
for (char c : s.toCharArray()) {map.put(c, map.getOrDefault(c, 0) + 1); }
- 将字符串
s
转换为字符数组。 - 遍历每个字符,将其放入
map
中。如果字符已经存在,则其计数加 1;否则,将其计数初始化为 1。
- 将字符串
-
初始化结果字符串
StringBuilder result = new StringBuilder();
StringBuilder
用于构造可变的字符串结果。
-
主循环,直到
TreeMap
为空while (!map.isEmpty()) {
- 只要
map
不是空的,我们就继续构造结果字符串。
- 只要
-
选择最小字符
for (Iterator<Map.Entry<Character, Integer>> it = map.entrySet().iterator(); it.hasNext();) {Map.Entry<Character, Integer> entry = it.next();result.append(entry.getKey());if (entry.getValue() == 1) {it.remove();} else {entry.setValue(entry.getValue() - 1);} }
entrySet().iterator()
返回一个Iterator
,它遍历map
中的每个条目(字符及其计数)。it.next()
返回下一个条目。entry.getKey()
获取当前条目的字符,将其添加到结果字符串中。- 如果字符计数为 1,调用
it.remove()
从map
中移除当前条目。 - 否则,减少字符计数。
-
选择最大字符
for (Iterator<Map.Entry<Character, Integer>> it = map.descendingMap().entrySet().iterator(); it.hasNext();) {Map.Entry<Character, Integer> entry = it.next();result.append(entry.getKey());if (entry.getValue() == 1) {it.remove();} else {entry.setValue(entry.getValue() - 1);} }
descendingMap()
返回一个逆序视图的TreeMap
。entrySet().iterator()
返回一个Iterator
,它遍历逆序map
中的每个条目。- 其余逻辑与选择最小字符相同,但此时是按降序选择字符。
-
返回结果字符串
return result.toString();
- 将
StringBuilder
转换为字符串并返回。
- 将
迭代器详细解释
-
定义和使用
for (Iterator<Map.Entry<Character, Integer>> it = map.entrySet().iterator(); it.hasNext();) {Map.Entry<Character, Integer> entry = it.next();
Iterator
是一个接口,允许我们遍历集合。entrySet().iterator()
返回一个遍历map
条目的Iterator
。it.hasNext()
检查是否有下一个条目。it.next()
返回下一个条目。
-
移除元素
if (entry.getValue() == 1) {it.remove(); }
- 使用
Iterator
的remove
方法可以安全地在遍历集合时移除元素,避免ConcurrentModificationException
。
- 使用
通过这种方式,使用 TreeMap
和 Iterator
,我们可以有效地按照指定顺序重构字符串。
这篇关于关于上升下降字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!