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 1cfc3df

Browse files
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‎

Lines changed: 79 additions & 0 deletions
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‎

Lines changed: 79 additions & 0 deletions
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‎

Lines changed: 76 additions & 0 deletions
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)

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