力扣小白刷题之451题根据字符出现频率排序

题目描述

给定一个字符串,请将字符串里的字符按照出现的频率进行降序排序。

思路

桶排序。

  1. 创建一个 Map 记录每个字符出现的频率
  2. 创建一个桶 List 将字符按频率升序放入桶中,每个桶里放出现频率相同的字符。第 i 个桶中存储的字符频率为 i。
  3. 倒序遍历桶,依次遍历输出每个桶中的元素。

代码

力扣小白刷题之451题根据字符出现频率排序

一些问题

  1. Java String类中的 toCharArray() 方法将字符串转换为字符数组。
    语法:public char[] toCharArray()
    参数:无
    返回值:字符数组。

  2. List<Character>[] buckets = new ArrayList[s.length() + 1]; 声明了一个List 类型的数组。

  3. if (buckets[i] == null) { buckets[i] = new ArrayList<>(); } List 类型的数组中每个元素都是一个 ArrayList 集合。

  4. String、StringBuffer、StringBuilder的区别:

    1. String类是不可变类。再次给 a 赋值时,并不是对原来堆中实例对象进行重新赋值,而是生成一个新的实例对象,并且指向"456"这个字符串,a 则指向最新生成的实例对象,之前的实例对象仍然存在,如果没有被再次利用,则会被垃圾回收。
    2. StringBuffer对象代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
    3. StringBuilder类 (字符串缓冲区) 也代表可变字符串对象
      与StringBuffer基本相似。不同之处:
      * Stringbuffer 线程安全
      * StringBuilder 没有实现线程安全功能,所以性能略高
      常用方法:
      * append(String str) / append(Char c) :字符串连接
      * toString():返回一个与构建器或缓冲器内容相同的字符串。可以得到一个String对象,其中包含了构建器中的字符序列。