java string编程题
Java String编程题
题目描述:
给定一个字符串s,将字符串s中的所有字符按照它们在s中出现的次数降序排列。如果出现次数一样多的话那么就按照字典序排序。输出排序后的字符串。
例如:s = "eeeeeaaadddbbbccc",输出 "eeeaaadddbbbccc"
解题思路:
这道题目的难点在于如何对字符串s中各个字符的出现次数进行计算和排序。可以使用散列表(Hash Table)来实现对字符出现次数的计算,然后将每个字符作为键,出现次数作为值,存储到散列表中。具体做法如下:
- 遍历字符串s中的每个字符,将字符作为键,将出现次数初始化为0,存储到散列表中。
-
再次遍历字符串s中的每个字符,每当遇到一个字符时,在散列表中将该字符的出现次数+1。
- 最后,遍历一遍散列表,将键值对按照值(即出现次数)进行降序排列,并将排好序的键输出。
排序的部分可以使用Java内置的PriorityQueue实现,PriorityQueue是一种基于堆的优先队列,可以按照元素的自然顺序或者指定的顺序(如本题中的出现次数)来排序元素。
Java代码实现:
后端字符串转数组import java.util.*;
public class Solution {
public String frequencySort(String s) {
Map<Character, Integer> map = new HashMap<>();
// 统计每个字符的出现次数
for (char c : s.toCharArray()) {
map.put(c, OrDefault(c, 0) + 1);
}
// 按照出现次数对键值对进行排序
PriorityQueue<Character> queue = new PriorityQueue<>((a, b) -> (b) - (a));
for (char c : map.keySet()) {
queue.offer(c);
}
// 输出排序后的字符串
StringBuilder sb = new StringBuilder();
while (!queue.isEmpty()) {
char c = queue.poll();
int count = (c);
for (int i = 0; i < count; i++) {
sb.append(c);
}
}
String();
}
}
时间复杂度:O(n log n),其中n是字符串s的长度。其中,遍历字符串时需要O(n)的时间,建立优先队列和输出结果时需要O(n log n)的时间。
空间复杂度:O(n),其中n是字符串s的长度。空间复杂度主要取决于散列表和优先队列中存储的键值对数目。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论