Skip to content

Commit df717f7

Browse files
authored
feat: add swift implementation to lcof2 problem: No.031 (#3036)
1 parent 532bfa2 commit df717f7

File tree

2 files changed

+181
-0
lines changed

2 files changed

+181
-0
lines changed

lcof2/剑指 Offer II 031. 最近最少使用缓存/README.md

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,99 @@ public class LRUCache {
667667
*/
668668
```
669669

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+
670763
<!-- tabs:end -->
671764

672765
<!-- solution:end -->
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
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+
*/

0 commit comments

Comments
 (0)