Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit df717f7

Browse files
feat: add swift implementation to lcof2 problem: No.031 (doocs#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)

AltStyle によって変換されたページ (->オリジナル) /