|
| 1 | +class node: |
| 2 | + def __init__(self,val=None,data_mp=None,pre=None,next=None): |
| 3 | + self.val=val |
| 4 | + self.data_mp = {} if data_mp is None else data_mp |
| 5 | + self.pre=pre |
| 6 | + self.next=next |
| 7 | + def __lt__(self,nd): |
| 8 | + return self.val<nd.val |
| 9 | + def getOne(self): |
| 10 | + if not self.data_mp: |
| 11 | + return '' |
| 12 | + else:return list(self.data_mp.items())[0][0] |
| 13 | + def __getitem__(self,key): |
| 14 | + return self.data_mp[key] |
| 15 | + def __iter__(self): |
| 16 | + return iter(self.data_mp) |
| 17 | + def __delitem__(self,key): |
| 18 | + del self.data_mp[key] |
| 19 | + def __setitem__(self,key,val): |
| 20 | + self.data_mp[key]= val |
| 21 | + def isEmpty(self): |
| 22 | + return self.data_mp=={} |
| 23 | + def __repr__(self): |
| 24 | + return 'node({},{})'.format(self.val,self.data_mp) |
| 25 | +class doubleLinkedList: |
| 26 | + def __init__(self): |
| 27 | + self.head= self.tail = node(0) |
| 28 | + self.head.next = self.head |
| 29 | + self.head.pre = self.head |
| 30 | + self.chain_mp={0:self.head} |
| 31 | + def __str__(self): |
| 32 | + li = list(self.chain_mp.values()) |
| 33 | + li = [str(i) for i in li] |
| 34 | + return 'min:{}, max:{}\n'.format(self.head.val,self.tail.val) \ |
| 35 | + + '\n'.join(li) |
| 36 | + def getMax(self): |
| 37 | + return self.tail.getOne() |
| 38 | + def getMin(self): |
| 39 | + return self.head.getOne() |
| 40 | + def addIncNode(self,val): |
| 41 | + # when adding a node,inc 1, so it's guranted that node(val-1) exists |
| 42 | + self.chain_mp[val].pre= self.chain_mp[val-1] |
| 43 | + self.chain_mp[val].next= self.chain_mp[val-1].next |
| 44 | + self.chain_mp[val-1].next.pre = self.chain_mp[val-1].next = self.chain_mp[val] |
| 45 | + def addDecNode(self,val): |
| 46 | + # when adding a node,dec 1, so it's guranted that node(val+1) exists |
| 47 | + self.chain_mp[val].next= self.chain_mp[val+1] |
| 48 | + self.chain_mp[val].pre= self.chain_mp[val+1].pre |
| 49 | + self.chain_mp[val+1].pre.next = self.chain_mp[val+1].pre = self.chain_mp[val] |
| 50 | + def addNode(self,val,dec=False): |
| 51 | + self.chain_mp[val] = node(val) |
| 52 | + if dec:self.addDecNode(val) |
| 53 | + else:self.addIncNode(val) |
| 54 | + if self.tail.val<val:self.tail = self.chain_mp[val] |
| 55 | + if self.head.val>val or self.head.val==0:self.head= self.chain_mp[val] |
| 56 | + def delNode(self,val): |
| 57 | + self.chain_mp[val].next.pre = self.chain_mp[val].pre |
| 58 | + self.chain_mp[val].pre.next = self.chain_mp[val].next |
| 59 | + if self.tail.val==val:self.tail = self.chain_mp[val].pre |
| 60 | + if self.head.val==val:self.head = self.chain_mp[val].next |
| 61 | + del self.chain_mp[val] |
| 62 | + def incTo(self,key,val): |
| 63 | + if val not in self.chain_mp: |
| 64 | + self.addNode(val) |
| 65 | + self.chain_mp[val][key] = val |
| 66 | + if val!=1 : # key in the pre node |
| 67 | + del self.chain_mp[val-1][key] |
| 68 | + #print(self.chain_mp[val-1]) |
| 69 | + if self.chain_mp[val-1].isEmpty(): |
| 70 | + #print('*'*20) |
| 71 | + self.delNode(val-1) |
| 72 | + def decTo(self,key,val): |
| 73 | + if val not in self.chain_mp: |
| 74 | + self.addNode(val,dec=True) |
| 75 | + # notice that the headnode(0) shouldn't add key |
| 76 | + if val!=0: self.chain_mp[val][key] = val |
| 77 | + del self.chain_mp[val+1][key] |
| 78 | + if self.chain_mp[val+1].isEmpty(): |
| 79 | + self.delNode(val+1) |
| 80 | + |
| 81 | +class AllOne: |
| 82 | + def __init__(self): |
| 83 | + """ |
| 84 | + Initialize your data structure here. |
| 85 | + """ |
| 86 | + self.op = {"inc":self.inc,"dec":self.dec,"getMaxKey":self.getMaxKey,"getMinKey":self.getMinKey} |
| 87 | + self.mp = {} |
| 88 | + self.dll = doubleLinkedList() |
| 89 | + def __str__(self): |
| 90 | + return str(self.dll) |
| 91 | + def __getitem__(self,key): |
| 92 | + return self.mp[key] |
| 93 | + def __delitem__(self,key): |
| 94 | + del self.mp[key] |
| 95 | + def __setitem__(self,key,val): |
| 96 | + self.mp[key]= val |
| 97 | + def __iter__(self): |
| 98 | + return iter(self.mp) |
| 99 | + def inc(self, key,n=1): |
| 100 | + """ |
| 101 | + Inserts a new key <Key> with value 1. Or increments an existing key by 1. |
| 102 | + :type key: str |
| 103 | + :rtype: void |
| 104 | + """ |
| 105 | + if key in self: |
| 106 | + self[key]+=n |
| 107 | + else:self[key]=n |
| 108 | + for i in range(n): self.dll.incTo(key, self[key]) |
| 109 | + def dec(self, key,n=1): |
| 110 | + """ |
| 111 | + Decrements an existing key by 1. If Key's value is 1, remove it from the data structure. |
| 112 | + :type key: str |
| 113 | + :rtype: void |
| 114 | + """ |
| 115 | + if key in self.mp: |
| 116 | + mn = min( self[key],n) |
| 117 | + for i in range(mn): self.dll.decTo(key, self[key]-i-1) |
| 118 | + if self[key] == n: |
| 119 | + del self[key] |
| 120 | + else: |
| 121 | + self[key] = self[key]-n |
| 122 | + def getMaxKey(self): |
| 123 | + """ |
| 124 | + Returns one of the keys with maximal value. |
| 125 | + :rtype: str |
| 126 | + """ |
| 127 | + return self.dll.getMax() |
| 128 | + |
| 129 | + def getMinKey(self): |
| 130 | + """ |
| 131 | + Returns one of the keys with Minimal value. |
| 132 | + :rtype: str |
| 133 | + """ |
| 134 | + return self.dll.getMin() |
| 135 | + |
| 136 | + |
| 137 | + |
| 138 | + |
| 139 | +if __name__ == '__main__': |
| 140 | + ops=["inc","inc","inc","inc","inc","dec","dec","getMaxKey","getMinKey"] |
| 141 | + data=[["a"],["b"],["b"],["b"],["b"],["b"],["b"],[],[]] |
| 142 | + obj = AllOne() |
| 143 | + for op,datum in zip(ops,data): |
| 144 | + print(obj.op[op](*datum)) |
| 145 | + print(op,datum) |
| 146 | + print(obj) |
| 147 | + |
| 148 | +''' |
| 149 | +None |
| 150 | +inc ['a'] |
| 151 | +min:1, max:1 |
| 152 | +node(0,{}) |
| 153 | +node(1,{'a': 1}) |
| 154 | +None |
| 155 | +inc ['b'] |
| 156 | +min:1, max:1 |
| 157 | +node(0,{}) |
| 158 | +node(1,{'a': 1, 'b': 1}) |
| 159 | +None |
| 160 | +inc ['b'] |
| 161 | +min:1, max:2 |
| 162 | +node(0,{}) |
| 163 | +node(1,{'a': 1}) |
| 164 | +node(2,{'b': 2}) |
| 165 | +None |
| 166 | +inc ['b'] |
| 167 | +min:1, max:3 |
| 168 | +node(0,{}) |
| 169 | +node(1,{'a': 1}) |
| 170 | +node(3,{'b': 3}) |
| 171 | +None |
| 172 | +inc ['b'] |
| 173 | +min:1, max:4 |
| 174 | +node(0,{}) |
| 175 | +node(1,{'a': 1}) |
| 176 | +node(4,{'b': 4}) |
| 177 | +None |
| 178 | +dec ['b'] |
| 179 | +min:1, max:3 |
| 180 | +node(0,{}) |
| 181 | +node(1,{'a': 1}) |
| 182 | +node(3,{'b': 3}) |
| 183 | +None |
| 184 | +dec ['b'] |
| 185 | +min:1, max:2 |
| 186 | +node(0,{}) |
| 187 | +node(1,{'a': 1}) |
| 188 | +node(2,{'b': 2}) |
| 189 | +b |
| 190 | +getMaxKey [] |
| 191 | +min:1, max:2 |
| 192 | +node(0,{}) |
| 193 | +node(1,{'a': 1}) |
| 194 | +node(2,{'b': 2}) |
| 195 | +a |
| 196 | +getMinKey [] |
| 197 | +min:1, max:2 |
| 198 | +node(0,{}) |
| 199 | +node(1,{'a': 1}) |
| 200 | +node(2,{'b': 2}) |
| 201 | +''' |
0 commit comments