File tree Expand file tree Collapse file tree 2 files changed +181
-0
lines changed
lcof2/剑指 Offer II 031. 最近最少使用缓存 Expand file tree Collapse file tree 2 files changed +181
-0
lines changed Original file line number Diff line number Diff line change @@ -667,6 +667,99 @@ public class LRUCache {
667
667
*/
668
668
```
669
669
670
+ #### Swift
671
+
672
+ ``` swift
673
+ class Node {
674
+ var key: Int
675
+ var val: Int
676
+ var prev: Node?
677
+ var next: Node?
678
+
679
+ init () {
680
+ self .key = 0
681
+ self .val = 0
682
+ }
683
+
684
+ init (_ key : Int , _ val : Int ) {
685
+ self .key = key
686
+ self .val = val
687
+ }
688
+ }
689
+
690
+ class LRUCache {
691
+ private var cache = [Int : Node]()
692
+ private let head: Node
693
+ private let tail: Node
694
+ private let capacity: Int
695
+ private var size: Int
696
+
697
+ init (_ capacity : Int ) {
698
+ self .capacity = capacity
699
+ self .size = 0
700
+ self .head = Node ()
701
+ self .tail = Node ()
702
+ head.next = tail
703
+ tail.prev = head
704
+ }
705
+
706
+ func get (_ key : Int ) -> Int {
707
+ guard let node = cache[key] else {
708
+ return -1
709
+ }
710
+ moveToHead (node)
711
+ return node.val
712
+ }
713
+
714
+ func put (_ key : Int , _ value : Int ) {
715
+ if let node = cache[key] {
716
+ node.val = value
717
+ moveToHead (node)
718
+ } else {
719
+ let newNode = Node (key, value)
720
+ cache[key] = newNode
721
+ addToHead (newNode)
722
+ size += 1
723
+ if size > capacity {
724
+ let tail = removeTail ()
725
+ cache.removeValue (forKey : tail.key )
726
+ size -= 1
727
+ }
728
+ }
729
+ }
730
+
731
+ private func moveToHead (_ node : Node) {
732
+ removeNode (node)
733
+ addToHead (node)
734
+ }
735
+
736
+ private func removeNode (_ node : Node) {
737
+ node.prev ? .next = node.next
738
+ node.next ? .prev = node.prev
739
+ }
740
+
741
+ private func addToHead (_ node : Node) {
742
+ node.next = head.next
743
+ node.prev = head
744
+ head.next ? .prev = node
745
+ head.next = node
746
+ }
747
+
748
+ private func removeTail () -> Node {
749
+ let node = tail.prev !
750
+ removeNode (node)
751
+ return node
752
+ }
753
+ }
754
+
755
+ /**
756
+ * Your LRUCache object will be instantiated and called as such:
757
+ * let obj = LRUCache(capacity)
758
+ * let ret_1: Int = obj.get(key)
759
+ * obj.put(key, value)
760
+ */
761
+ ```
762
+
670
763
<!-- tabs:end -->
671
764
672
765
<!-- solution:end -->
Original file line number Diff line number Diff line change
1
+ class Node {
2
+ var key : Int
3
+ var val : Int
4
+ var prev : Node ?
5
+ var next : Node ?
6
+
7
+ init ( ) {
8
+ self . key = 0
9
+ self . val = 0
10
+ }
11
+
12
+ init ( _ key: Int , _ val: Int ) {
13
+ self . key = key
14
+ self . val = val
15
+ }
16
+ }
17
+
18
+ class LRUCache {
19
+ private var cache = [ Int: Node] ( )
20
+ private let head : Node
21
+ private let tail : Node
22
+ private let capacity : Int
23
+ private var size : Int
24
+
25
+ init ( _ capacity: Int ) {
26
+ self . capacity = capacity
27
+ self . size = 0
28
+ self . head = Node ( )
29
+ self . tail = Node ( )
30
+ head. next = tail
31
+ tail. prev = head
32
+ }
33
+
34
+ func get( _ key: Int ) -> Int {
35
+ guard let node = cache [ key] else {
36
+ return - 1
37
+ }
38
+ moveToHead ( node)
39
+ return node. val
40
+ }
41
+
42
+ func put( _ key: Int , _ value: Int ) {
43
+ if let node = cache [ key] {
44
+ node. val = value
45
+ moveToHead ( node)
46
+ } else {
47
+ let newNode = Node ( key, value)
48
+ cache [ key] = newNode
49
+ addToHead ( newNode)
50
+ size += 1
51
+ if size > capacity {
52
+ let tail = removeTail ( )
53
+ cache. removeValue ( forKey: tail. key)
54
+ size -= 1
55
+ }
56
+ }
57
+ }
58
+
59
+ private func moveToHead( _ node: Node ) {
60
+ removeNode ( node)
61
+ addToHead ( node)
62
+ }
63
+
64
+ private func removeNode( _ node: Node ) {
65
+ node. prev? . next = node. next
66
+ node. next? . prev = node. prev
67
+ }
68
+
69
+ private func addToHead( _ node: Node ) {
70
+ node. next = head. next
71
+ node. prev = head
72
+ head. next? . prev = node
73
+ head. next = node
74
+ }
75
+
76
+ private func removeTail( ) -> Node {
77
+ let node = tail. prev!
78
+ removeNode ( node)
79
+ return node
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Your LRUCache object will be instantiated and called as such:
85
+ * let obj = LRUCache(capacity)
86
+ * let ret_1: Int = obj.get(key)
87
+ * obj.put(key, value)
88
+ */
You can’t perform that action at this time.
0 commit comments