这道题第一反应还是桶排序,和347类似,但是实现的过程中也遇到了一点坑,记录一下:
1 char的封装类型是Character,开发中用的不多,所以忽略了;
2 这道题的要求是根据字符出现的频率排序,所以不同于347的是,我们最后遍历的时候,需要按照字符出现的频率把对应的数量的字符添加进去。
代码:
https://github.com/hanleirx/LeetCode/blob/master/451.%20%E6%A0%B9%E6%8D%AE%E5%AD%97%E7%AC%A6%E5%87%BA%E7%8E%B0%E9%A2%91%E7%8E%87%E6%8E%92%E5%BA%8F%E2%80%94%E2%80%94%E6%A1%B6%E6%8E%92%E5%BA%8F
看解答里面很多用堆排序实现的,虽然效率没有这个高,但我也打算学习一下。
1 以前用过最小堆,直接利用PriorityQueue就好了,但是最大堆有点不一样,需要传入排序函数,PriorityQueue<Map.Entry<Character,Integer>> heap = new PriorityQueue<>((o1,o2) -> o2.getValue() - o1.getValue());这里return o2-o1表示降序;
2 然后可以将元素都加进去, heap.addAll(map.entrySet());
3 最后遍历的结束条件是heap.isEmpty() 堆中元素为空。
代码:
https://github.com/hanleirx/LeetCode/blob/master/451.%20%E6%A0%B9%E6%8D%AE%E5%AD%97%E7%AC%A6%E5%87%BA%E7%8E%B0%E9%A2%91%E7%8E%87%E6%8E%92-%E6%9C%80%E5%A4%A7%E5%A0%86
网友评论