1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- type none struct{}
- type pair {
- key int
- set map[string]none
- }
- type AllOne struct {
- m map[string]*list.Element
- li *list.List
- }
- /** Initialize your data structure here. */
- func Constructor() AllOne {
- return AllOne{
- m: make(map[string]*list.Element),
- li: list.New(),
- }
- }
- /** Inserts a new key <Key> with value 1. Or increments an existing key by 1. */
- func (this *AllOne) Inc(key string) {
- if val, ok := this.m[key]; ok { // Increments
- next := val.Next()
- if next == nil || val.(pair).key+1 != next.(pair).key { // Insert after
- next =
- } else { // Increment after
-
- }
- this.m[key] = next
- } else { // Inserts
- if this.li.Len() == 0 || this.li.Front().Value.(pair).key != 1 {
- this.li.PushFront(pair{1, map[string]none{key: none{}})
- } else {
- this.li.Front().Value.(pair).set[key] = none{}
- }
- this.m[key] = this.li.Front()
- }
- }
- /** Decrements an existing key by 1. If Key's value is 1, remove it from the data structure. */
- func (this *AllOne) Dec(key string) {
- if val, ok := this.m[key]; ok {
-
- }
- }
- /** Returns one of the keys with maximal value. */
- func (this *AllOne) GetMaxKey() string {
- if this.li.Len() == 0 {
- return ""
- }
- set := this.li.Back().Value.(pair).set
- for k := range set {
- return k
- }
- }
- /** Returns one of the keys with Minimal value. */
- func (this *AllOne) GetMinKey() string {
- if this.li.Len() == 0 {
- return ""
- }
- set := this.li.Front().Value.(pair).set
- for k := range set {
- return k
- }
- }
- /**
- * Your AllOne object will be instantiated and called as such:
- * obj := Constructor();
- * obj.Inc(key);
- * obj.Dec(key);
- * param_3 := obj.GetMaxKey();
- * param_4 := obj.GetMinKey();
- */
|