【发布时间】:2021-06-07 19:50:28
【问题描述】:
我有一个要求,我需要在原始列表中将相似的元素组合在一起。
例如:
I/P 数组:
[1, 2, 3, A1, B1, 4, B2, 5, 6, C1, B3, B4, 7, 8, 9, 10, A2, A3, 11, 12, A4, C2, D1]
现在我想对以字母开头的元素进行分组,这样属于特定字母的所有元素都放在一起,并将被放置在该字母第一次出现之后。
O/P 数组:
[1, 2, 3, A1, A2, A3, A4, B1, B2, B3, B4, 4, 5, 6, C1, C2, 7, 8, 9, 10, 11, 12, D1]
我想出的一个简单的解决方案是维护一个表示字母及其元素的 HashMap Map<Character, Queue<Element>> 并执行以下步骤:
-
遍历列表,如果遇到字母,请执行以下操作之一:
1.1 如果地图中不存在字母表,则将其添加到带有空队列的地图中,
map.put('A', new LinkedList<>())1.2 如果地图中存在字母表,则将其从原始列表中移除,并将其添加到地图中其对应的队列中,
list.remove(element)和map.get('A').add(element) -
再次遍历原始列表,当遇到一个字母时,从地图中添加其对应的队列。
我认为这个解决方案可行,但我不确定它是否会因边缘情况而失败,或者它是否是最佳解决方案(即使它的复杂度为 O(n))。
谁能推荐一个更好的选择?
【问题讨论】:
-
您可以记住每个“字母”的第一个在哪里,因此您不必重新扫描列表即可找到它们。
-
这实现起来可能有点复杂,因为每当我在第一次迭代期间删除元素并在第二次迭代期间添加元素时,索引都会发生变化。
-
元素是否总是一个整数或单个字符后跟一个整数?
-
@bliss 是的,没错
-
为什么输出数组不是以 1..12 开头的?这不是字母吗?
标签: java arrays algorithm data-structures hashmap