Skip to content

Instantly share code, notes, and snippets.

@bachiri
Created August 31, 2019 20:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bachiri/dd71d4923102bbf3f42d71ebc5392b1a to your computer and use it in GitHub Desktop.
Save bachiri/dd71d4923102bbf3f42d71ebc5392b1a to your computer and use it in GitHub Desktop.
451. Sort Characters By Frequency / Leetcode
public class SortCharactersByFrequency {
public static void main(String[] args) {
System.out.println(frequencySort("Leetcode"));
}
public static String frequencySort(String s) {
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
}
PriorityQueue<CharacterFrequency> priorityQueue = new PriorityQueue<>();
for (HashMap.Entry<java.lang.Character, Integer> entry : map.entrySet()) {
priorityQueue.offer(new CharacterFrequency(entry.getKey(), entry.getValue()));
}
StringBuilder stringBuilder = new StringBuilder();
while (!priorityQueue.isEmpty()) {
CharacterFrequency characterFrequency = priorityQueue.poll();
for (int i = 0; i < characterFrequency.frequency; i++) {
stringBuilder.append(characterFrequency.character);
}
}
return stringBuilder.toString();
}
static class CharacterFrequency implements Comparable<CharacterFrequency> {
Character character;
int frequency;
public CharacterFrequency(java.lang.Character character, int frequency) {
this.character = character;
this.frequency = frequency;
}
@Override
public int compareTo(CharacterFrequency that) {
if (this.frequency > 0 || that.frequency > 0) {
return that.frequency - this.frequency;
}
return that.character.compareTo(this.character);
}
}
}
@bachiri
Copy link
Author

bachiri commented Aug 31, 2019

Second Version :

    public static String frequencySortBis(String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
        }
        PriorityQueue<Character> priorityQueue = new PriorityQueue<>((o1, o2) -> map.get(o2) - map.get(o1));
        priorityQueue.addAll(map.keySet());
        StringBuilder stringBuilder = new StringBuilder();
        while (!priorityQueue.isEmpty()) {
            Character character = priorityQueue.poll();
            for (int i = 0; i < map.get(character); i++) {
                stringBuilder.append(character);
            }
        }
        return stringBuilder.toString();
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment