Skip to content

Commit de66236

Browse files
committed
0432
1 parent 509b4b8 commit de66236

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed
+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
class AllOne
2+
LLNode = Struct.new(:prev, :next, :val, :keys, :key) do
3+
def append(key)
4+
node = LLNode.new(nil, nil, val + 1, {})
5+
node.prev = self
6+
node.next = self.next
7+
self.next&.prev = node
8+
self.next = node
9+
10+
node.keys[key] = true
11+
node.key = key
12+
node
13+
end
14+
15+
def prepend(key)
16+
node = LLNode.new(nil, nil, val - 1, {})
17+
node.next = self
18+
node.prev = self.prev
19+
self.prev&.next = node
20+
self.prev = node
21+
22+
node.keys[key] = true
23+
node.key = key
24+
node
25+
end
26+
27+
def delete_key(key)
28+
self.keys.delete(key)
29+
self.key = self.keys.keys.first if self.key = key
30+
end
31+
32+
def remove
33+
self.prev&.next = self.next
34+
self.next&.prev = self.prev
35+
end
36+
end
37+
38+
def initialize()
39+
@head = LLNode.new(nil, nil, 0, {}, nil)
40+
@head.next = @head
41+
@head.prev = @head
42+
@key_to_node = Hash.new
43+
end
44+
45+
def inc(key)
46+
if @key_to_node.has_key?(key)
47+
old_node = @key_to_node[key]
48+
if old_node.next == @head || old_node.next.val > old_node.val + 1
49+
@key_to_node[key] = old_node.append(key)
50+
else
51+
old_node.next.keys[key] = true
52+
@key_to_node[key] = old_node.next
53+
end
54+
old_node.delete_key(key)
55+
if old_node.keys.empty?
56+
old_node.remove
57+
end
58+
else
59+
if @head.next == @head || @head.next.val > 1
60+
@key_to_node[key] = @head.append(key)
61+
else
62+
@head.next.keys[key] = true
63+
@key_to_node[key] = @head.next
64+
end
65+
end
66+
end
67+
68+
def dec(key)
69+
if @key_to_node.has_key?(key)
70+
old_node = @key_to_node[key]
71+
if old_node.val == 1
72+
@key_to_node.delete(key)
73+
else
74+
if old_node.prev == @head || old_node.prev.val < old_node.val - 1
75+
@key_to_node[key] = old_node.prepend(key)
76+
else
77+
old_node.prev.keys[key] = true
78+
@key_to_node[key] = old_node.prev
79+
end
80+
end
81+
old_node.delete_key(key)
82+
if old_node.keys.empty?
83+
old_node.remove
84+
end
85+
end
86+
end
87+
88+
def get_max_key()
89+
@head.prev.key || ""
90+
end
91+
92+
def get_min_key()
93+
@head.next.key || ""
94+
end
95+
end

0 commit comments

Comments
 (0)