diff options
-rw-r--r-- | 451/go.mod | 3 | ||||
-rw-r--r-- | 451/main.go | 54 |
2 files changed, 57 insertions, 0 deletions
diff --git a/451/go.mod b/451/go.mod new file mode 100644 index 0000000..b3a3c4d --- /dev/null +++ b/451/go.mod @@ -0,0 +1,3 @@ +module 451 + +go 1.18 diff --git a/451/main.go b/451/main.go new file mode 100644 index 0000000..f025ce7 --- /dev/null +++ b/451/main.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + "sort" +) + +func frequencySort(s string) string { + dict := func(s string) map[int]int { + dict := make(map[int]int) + + for i := 0; i < len(s); i++ { + if _, ok := dict[int(s[i])]; ok { + dict[int(s[i])]++ + } else { + dict[int(s[i])] = 1 + } + } + + return dict + }(s) + + type kv struct { + key int + val int + } + + var ss []kv + + for k, v := range dict { + ss = append(ss, kv{k, v}) + } + + sort.Slice(ss, func(i, j int) bool { + return ss[i].val > ss[j].val + }) + + bytes := make([]byte, len(s), len(s)) + counter := 0 + for _, kv := range ss { + for i := 0; i < kv.val; i++ { + bytes[counter] = byte(kv.key) + counter++ + } + } + + return string(bytes) +} + +func main() { + fmt.Println(frequencySort("tree")) + fmt.Println(frequencySort("cccaaa")) + fmt.Println(frequencySort("Aabb")) +} |