力扣小白刷题之451题根据字符出现频率排序
题目描述
给定一个字符串,请将字符串里的字符按照出现的频率进行降序排序。
思路
桶排序。
- 创建一个 Map 记录每个字符出现的频率
- 创建一个桶 List 将字符按频率升序放入桶中,每个桶里放出现频率相同的字符。第 i 个桶中存储的字符频率为 i。
- 倒序遍历桶,依次遍历输出每个桶中的元素。
代码
一些问题
-
Java String类中的 toCharArray() 方法将字符串转换为字符数组。
语法:public char[] toCharArray()
参数:无
返回值:字符数组。 -
List<Character>[] buckets = new ArrayList[s.length() + 1];
声明了一个List 类型的数组。 -
if (buckets[i] == null) { buckets[i] = new ArrayList<>(); }
List 类型的数组中每个元素都是一个 ArrayList 集合。 -
String、StringBuffer、StringBuilder的区别:
- String类是不可变类。再次给 a 赋值时,并不是对原来堆中实例对象进行重新赋值,而是生成一个新的实例对象,并且指向"456"这个字符串,a 则指向最新生成的实例对象,之前的实例对象仍然存在,如果没有被再次利用,则会被垃圾回收。
- StringBuffer对象代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
- StringBuilder类 (字符串缓冲区) 也代表可变字符串对象
与StringBuffer基本相似。不同之处:
* Stringbuffer 线程安全
* StringBuilder 没有实现线程安全功能,所以性能略高
常用方法:
* append(String str) / append(Char c) :字符串连接
* toString():返回一个与构建器或缓冲器内容相同的字符串。可以得到一个String对象,其中包含了构建器中的字符序列。