美文网首页每日算法
每日算法之借助标准库解题(II)

每日算法之借助标准库解题(II)

作者: 树獭非懒 | 来源:发表于2018-08-28 17:52 被阅读0次

这次继续学习使用标准库里的数据结构来解题

Q:Given a string, sort it in decreasing order based on the frequency of characters.

翻译君:一个字符串,按字符出现的次数由多到少重新排序这个字符串。

例如:

Input:
"tree"

Output:
"eert"

这题需要统计字符出现的次数,所以我们可以用HashMap这一数据结构。它的key表示字符,value表示该字符在字符串中出现的次数。

下面是解答这题的流程

1.准备一个Hashmap容器,存储字符对应的出现次数

2.遍历字符串统计字符的出现次数

          HashMap<Character, Integer> record=new HashMap<>();
          for(char c:s.toCharArray()){
              if(record.containsKey(c))
                  record.put(c, record.get(c)+1);
              else
                  record.put(c,1);
          }

3.下一步我们就需要借助桶数组。
数组桶的目的是将出现次数相同的字符放在一个桶里,这样我们最后就可以根据桶来依次取出字符出现频率由高到低的元素了。

        //3.准备若干桶,次数相同的字符装在一个桶里
          List<Character>[] bucket=new List[s.length()+1];
          for(char key:record.keySet()){
              int freq=record.get(key);
              if (bucket[freq]==null) {
                bucket[freq]=new ArrayList<>();
            }
              bucket[freq].add(key);
          }

4.因为桶是用数组集合存储,这样我们数组的下标就表示某个字符出现的频率。所以最后我对这个集合从后往前遍历,依次取出字符(乘以频率)再通过StringBuilder拼装,结果就是一串字符频率由高到低的字符串了。

 StringBuilder sb=new StringBuilder();
          for(int pos=bucket.length-1;pos>=0;pos--){
              if (bucket[pos]!=null) {
                  for(char c:bucket[pos]){
                     for(int i=0;i<pos;i++)
                         sb.append(c);
                  }
            }  
          }

完整代码如下:

public String frequencySort(String s) {
          //1.准备一个hashmap容器,存储字符以及对应出现的次数
          HashMap<Character, Integer> record=new HashMap<>();
          //2.把字符和对应字符出现次数加到hashmap中
          for(char c:s.toCharArray()){
              if(record.containsKey(c))
                  record.put(c, record.get(c)+1);
              else
                  record.put(c,1);
          }
          
         //3.准备若干桶,次数相同的字符装在一个桶里
          List<Character>[] bucket=new List[s.length()+1];
          for(char key:record.keySet()){
              int freq=record.get(key);
              if (bucket[freq]==null) {
                bucket[freq]=new ArrayList<>();
            }
              bucket[freq].add(key);
          }
          
          
          //4.依次取出字符并封装
          StringBuilder sb=new StringBuilder();
          for(int pos=bucket.length-1;pos>=0;pos--){
              if (bucket[pos]!=null) {
                  for(char c:bucket[pos]){
                     for(int i=0;i<pos;i++)
                         sb.append(c);
                  }
            }  
          }
          
          return sb.toString();
              
      }

相关文章

  • 每日算法之借助标准库解题(II)

    这次继续学习使用标准库里的数据结构来解题 Q:Given a string, sort it in decreas...

  • 每日算法之借助标准库解题(I)

    解一些算法题时,我们可以借助语言标准库里的方法或数据结构,它能够有效的帮助我们。比如下面的两道LeetCode上的...

  • ORID 58 Meeting rooms II

    今天每日一题253. Meeting rooms II 用什么算法? 这道题首先要理解题意,为了用最少的房间来安排...

  • 186 做事标准

    #每日精进186/200 20200704 小时候解题有标准答案,长大后很多事情却没有标准的答案,哪怕简单的对错之...

  • 算法总结篇-(1)--算法思想

    算法包括三部分:算法思想 + 排序算法 + 查找算法 算法思想: 算法思想 就是 解题思路。常见的解题思路有如下:...

  • ORID54 BFS

    117. Populating Next Right Pointers in Each Node II 解题报告 ...

  • 47. Permutations II

    题目链接 https://leetcode.com/problems/permutations-ii/ 解题思路 ...

  • 59. Spiral Matrix II

    题目链接 https://leetcode.com/problems/spiral-matrix-ii/ 解题思路...

  • sort用法(转)

    一、c++标准库里的排序函数的使用方法 ​I)Sort函数包含在头文件为#include的c++标准库中 II)S...

  • PHP SPL

    SPL就是标准库包括:迭代器,算法数据结构,堆。

网友评论

    本文标题:每日算法之借助标准库解题(II)

    本文链接:https://www.haomeiwen.com/subject/nymqwftx.html