新增leetcode题解--swift版本哦 leetcode题解
先设计一个Queue的协议
protocol Queue{
associatedtype Element
mutating func enqueue(_ newElement: Element)
mutating func dequeue() -> Element?
}
///一个高效的FIFO队列,其元素类型为Element
struct FIFOQueue<Element>:Queue{
private var left: [Element] = []
private var right: [Element] = []
mutating func enquene(_ newElement: Element){
right.append(newElement)
}
mutating func dequenue() -> Element?{
if left.isEmpty{
left = right.reversed()
right.removeAll()
}
return left.popLast()
}
}
为什么我们要用两个数组来实现这个队列呢?其主要原因是为了效率,可以思考一下这样设置的妙处哈!!!
接下啦我们为FIFOQueue添加Collection协议
extension FIFOQueue: Collection{
public var startIndex: Int{return 0}
public var endIndex: Int{return left.count + right .count}
//precondition的用法与assert类似,当条件不满足时,则终止程序,并打印出你设置的message或者默认的错误提示
public func index(after i: Int) -> Int {
precondition(i < endIndex)
return i + 1
}
public subscript(position: Int) -> Element{
precondition((0..<endIndex).contains(position),"Index out of bounds")
if position < left.endIndex{
return left[left.count - position - 1]
}else{
return right[position - left.count]
}
}
typealias Indices = CountableRange<Int>
var indices: CountableRange<Int>{
return startIndex..<endIndex
}
}
为了让我们用熟悉的[value1,value2,ect]语法创建一个队列,我们可以让FIFOQueue遵守ExpressibleByArrayLiteral协议
extension FIFOQueue: ExpressibleByArrayLiteral{
public init(arrayLiteral elements: Element...) {
left = elements.reversed()
right = []
}
}
题目:寻找到100以内同时满足是偶数并且还是其他数字的平方的数字
(1...<10).map{$0 * $0}.filter{ $0 % 2 == 0}
//[4,16,36,64]
还记得我们最常见的for in 循环吗? 他的实现就是基于迭代器
protocol Sequence {
associatedtype Iteraator: IteratorProtocol
func makeIterator() -> Iterator
//...
}
protocol IteratorProtocol {
associatedtype Element
mutating func next() -> Element?
}
//那么for in 循环是怎么实现的呢?
var iterator = someSequence.makeIterator()
while let element = iterator.next() {
doSomething(with: element)
}
那么斐波那契序列怎么依靠迭代器实现呢?
struct Fibs: ItreatorProtocol {
var state = (0,1)
mutating func next() -> Int? {
let upcomingNumber = state.0
state = (state.1,state.0 + state.1)
return upcomingNumber
}
}
//这样就实现了斐波那契数列
//那么要如何使用呢?
var textFib = Fib()
while let fib = textFib.next(), fib < 1000000000{
print(fib)
}
这样就很顺利的打印了1000000000以内的斐波那契数,而且速度很快
class ListNode{
var val: Int
var next: ListNode?
init(_ val: Int) {
self.val = val
self.next = nil
}
}
class List{
var head: ListNode?
var real: ListNode?
//尾插法
func appendToReal(_ val: Int){
if real == nil {
real = ListNode(val)
head = real
}else{
real!.next = ListNode(val)
real = real!.next
}
}
//头插法
func appendToHead(_ val: Int){
if head == nil{
head = ListNode(val)
real = head
}else{
let temp = ListNode(val)
temp.next = head
head = temp
}
}
func printList(){
var temp = head
while temp != nil {
print(temp!.val)
temp = temp!.next
}
}
}
let textList = List()
[1,2,3,4,5].map{
textList.appendToHead($0)
}
textList.printList()