Skip to content

Commit 1cfc3df

Browse files
authored
feat: add swift implementation to lcci problem: No.16.25 (doocs#2769)
1 parent 67f6f2f commit 1cfc3df

File tree

3 files changed

+234
-0
lines changed

3 files changed

+234
-0
lines changed

lcci/16.25.LRU Cache/README.md

+79
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,85 @@ public class LRUCache {
610610
*/
611611
```
612612

613+
```swift
614+
class Node {
615+
var key: Int
616+
var val: Int
617+
var prev: Node?
618+
var next: Node?
619+
620+
init(_ key: Int = 0, _ val: Int = 0) {
621+
self.key = key
622+
self.val = val
623+
}
624+
}
625+
626+
class LRUCache {
627+
private var cache: [Int: Node] = [:]
628+
private let head: Node = Node()
629+
private let tail: Node = Node()
630+
private var capacity: Int
631+
private var size: Int = 0
632+
633+
init(_ capacity: Int) {
634+
self.capacity = capacity
635+
head.next = tail
636+
tail.prev = head
637+
}
638+
639+
func get(_ key: Int) -> Int {
640+
guard let node = cache[key] else {
641+
return -1
642+
}
643+
moveToHead(node)
644+
return node.val
645+
}
646+
647+
func put(_ key: Int, _ value: Int) {
648+
if let node = cache[key] {
649+
node.val = value
650+
moveToHead(node)
651+
} else {
652+
let newNode = Node(key, value)
653+
cache[key] = newNode
654+
addToHead(newNode)
655+
size += 1
656+
if size > capacity {
657+
if let tailNode = removeTail() {
658+
cache.removeValue(forKey: tailNode.key)
659+
size -= 1
660+
}
661+
}
662+
}
663+
}
664+
665+
private func moveToHead(_ node: Node) {
666+
removeNode(node)
667+
addToHead(node)
668+
}
669+
670+
private func removeNode(_ node: Node) {
671+
node.prev?.next = node.next
672+
node.next?.prev = node.prev
673+
}
674+
675+
private func addToHead(_ node: Node) {
676+
node.prev = head
677+
node.next = head.next
678+
head.next?.prev = node
679+
head.next = node
680+
}
681+
682+
private func removeTail() -> Node? {
683+
guard let res = tail.prev, res !== head else {
684+
return nil
685+
}
686+
removeNode(res)
687+
return res
688+
}
689+
}
690+
```
691+
613692
<!-- tabs:end -->
614693

615694
<!-- end -->

lcci/16.25.LRU Cache/README_EN.md

+79
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,85 @@ public class LRUCache {
623623
*/
624624
```
625625

626+
```swift
627+
class Node {
628+
var key: Int
629+
var val: Int
630+
var prev: Node?
631+
var next: Node?
632+
633+
init(_ key: Int = 0, _ val: Int = 0) {
634+
self.key = key
635+
self.val = val
636+
}
637+
}
638+
639+
class LRUCache {
640+
private var cache: [Int: Node] = [:]
641+
private let head: Node = Node()
642+
private let tail: Node = Node()
643+
private var capacity: Int
644+
private var size: Int = 0
645+
646+
init(_ capacity: Int) {
647+
self.capacity = capacity
648+
head.next = tail
649+
tail.prev = head
650+
}
651+
652+
func get(_ key: Int) -> Int {
653+
guard let node = cache[key] else {
654+
return -1
655+
}
656+
moveToHead(node)
657+
return node.val
658+
}
659+
660+
func put(_ key: Int, _ value: Int) {
661+
if let node = cache[key] {
662+
node.val = value
663+
moveToHead(node)
664+
} else {
665+
let newNode = Node(key, value)
666+
cache[key] = newNode
667+
addToHead(newNode)
668+
size += 1
669+
if size > capacity {
670+
if let tailNode = removeTail() {
671+
cache.removeValue(forKey: tailNode.key)
672+
size -= 1
673+
}
674+
}
675+
}
676+
}
677+
678+
private func moveToHead(_ node: Node) {
679+
removeNode(node)
680+
addToHead(node)
681+
}
682+
683+
private func removeNode(_ node: Node) {
684+
node.prev?.next = node.next
685+
node.next?.prev = node.prev
686+
}
687+
688+
private func addToHead(_ node: Node) {
689+
node.prev = head
690+
node.next = head.next
691+
head.next?.prev = node
692+
head.next = node
693+
}
694+
695+
private func removeTail() -> Node? {
696+
guard let res = tail.prev, res !== head else {
697+
return nil
698+
}
699+
removeNode(res)
700+
return res
701+
}
702+
}
703+
```
704+
626705
<!-- tabs:end -->
627706

628707
<!-- end -->

lcci/16.25.LRU Cache/Solution.swift

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
class Node {
2+
var key: Int
3+
var val: Int
4+
var prev: Node?
5+
var next: Node?
6+
7+
init(_ key: Int = 0, _ val: Int = 0) {
8+
self.key = key
9+
self.val = val
10+
}
11+
}
12+
13+
class LRUCache {
14+
private var cache: [Int: Node] = [:]
15+
private let head: Node = Node()
16+
private let tail: Node = Node()
17+
private var capacity: Int
18+
private var size: Int = 0
19+
20+
init(_ capacity: Int) {
21+
self.capacity = capacity
22+
head.next = tail
23+
tail.prev = head
24+
}
25+
26+
func get(_ key: Int) -> Int {
27+
guard let node = cache[key] else {
28+
return -1
29+
}
30+
moveToHead(node)
31+
return node.val
32+
}
33+
34+
func put(_ key: Int, _ value: Int) {
35+
if let node = cache[key] {
36+
node.val = value
37+
moveToHead(node)
38+
} else {
39+
let newNode = Node(key, value)
40+
cache[key] = newNode
41+
addToHead(newNode)
42+
size += 1
43+
if size > capacity {
44+
if let tailNode = removeTail() {
45+
cache.removeValue(forKey: tailNode.key)
46+
size -= 1
47+
}
48+
}
49+
}
50+
}
51+
52+
private func moveToHead(_ node: Node) {
53+
removeNode(node)
54+
addToHead(node)
55+
}
56+
57+
private func removeNode(_ node: Node) {
58+
node.prev?.next = node.next
59+
node.next?.prev = node.prev
60+
}
61+
62+
private func addToHead(_ node: Node) {
63+
node.prev = head
64+
node.next = head.next
65+
head.next?.prev = node
66+
head.next = node
67+
}
68+
69+
private func removeTail() -> Node? {
70+
guard let res = tail.prev, res !== head else {
71+
return nil
72+
}
73+
removeNode(res)
74+
return res
75+
}
76+
}

0 commit comments

Comments
 (0)