int变量被__block修饰之后会被包装成一个对象,如__block int age会被包装成下面如许
struct __Block_byref_age_0 { void *__isa;__Block_byref_age_0 *__forwarding; //指向本身 int __flags; int __size; int age;//包装的详细的值};// age = 20;会被编译成下面如许(age.__forwarding->age) = 20;复制代码12. 为什么在block外部使用__weak修饰的同时须要在内部使用__strong修饰?
自旋锁:自旋锁在无法举行加锁时,会不绝的举行实验,一般用于临界区的实行时间较短的场景,不外iOS的自旋锁OSSpinLock不再安全,重要缘故因由发生在低优先级线程拿到锁时,高优先级线程进入忙等(busy-wait)状态,斲丧大量 CPU 时间,从而导致低优先级线程拿不到 CPU 时间,也就无法完成使命并开释锁。这种题目被称为优先级反转。
extension Array where Element : Comparable{ public mutating func bubbleSort() { let count = self.count for i in 0..<count { for j in 0..<(count - 1 - i) { if self[j] > self[j + 1] { (self[j], self[j + 1]) = (self[j + 1], self[j]) } } } }}复制代码
选择排序
extension Array where Element : Comparable{ public mutating func selectionSort() { let count = self.count for i in 0..<count { var minIndex = I for j in (i+1)..<count { if self[j] < self[minIndex] { minIndex = j } } (self, self[minIndex]) = (self[minIndex], self[I]) } }}复制代码
插入排序
extension Array where Element : Comparable{ public mutating func insertionSort() { let count = self.count guard count > 1 else { return } for i in 1..<count { var preIndex = i - 1 let currentValue = self[I] while preIndex >= 0 && currentValue < self[preIndex] { self[preIndex + 1] = self[preIndex] preIndex -= 1 } self[preIndex + 1] = currentValue } }}复制代码
快速排序
extension Array where Element : Comparable{ public mutating func quickSort() { func quickSort(left:Int, right:Int) { guard left < right else { return } var i = left + 1,j = left let key = self[left] while i <= right { if self < key { j += 1 (self, self[j]) = (self[j], self[I]) } i += 1 } (self[left], self[j]) = (self[j], self[left]) quickSort(left: j + 1, right: right) quickSort(left: left, right: j - 1) } quickSort(left: 0, right: self.count - 1) }}复制代码
随机快排
extension Array where Element : Comparable{ public mutating func quickSort1() { func quickSort(left:Int, right:Int) { guard left < right else { return } let randomIndex = Int.random(in: left...right) (self[left], self[randomIndex]) = (self[randomIndex], self[left]) var i = left + 1,j = left let key = self[left] while i <= right { if self < key { j += 1 (self, self[j]) = (self[j], self[I]) } i += 1 } (self[left], self[j]) = (self[j], self[left]) quickSort(left: j + 1, right: right) quickSort(left: left, right: j - 1) } quickSort(left: 0, right: self.count - 1) }}复制代码
双路快排
extension Array where Element : Comparable{ public mutating func quickSort2() { func quickSort(left:Int, right:Int) { guard left < right else { return } let randomIndex = Int.random(in: left...right) (self[left], self[randomIndex]) = (self[randomIndex], self[left]) var l = left + 1, r = right let key = self[left] while true { while l <= r && self[l] < key { l += 1 } while l < r && key < self[r]{ r -= 1 } if l > r { break } (self[l], self[r]) = (self[r], self[l]) l += 1 r -= 1 } (self[r], self[left]) = (self[left], self[r]) quickSort(left: r + 1, right: right) quickSort(left: left, right: r - 1) } quickSort(left: 0, right: self.count - 1) }}复制代码
三路快排
// 三路快排extension Array where Element : Comparable{ public mutating func quickSort3() { func quickSort(left:Int, right:Int) { guard left < right else { return } let randomIndex = Int.random(in: left...right) (self[left], self[randomIndex]) = (self[randomIndex], self[left]) var lt = left, gt = right var i = left + 1 let key = self[left] while i <= gt { if self == key { i += 1 }else if self < key{ (self, self[lt + 1]) = (self[lt + 1], self[I]) lt += 1 i += 1 }else { (self, self[gt]) = (self[gt], self[I]) gt -= 1 } } (self[left], self[lt]) = (self[lt], self[left]) quickSort(left: gt + 1, right: right) quickSort(left: left, right: lt - 1) } quickSort(left: 0, right: self.count - 1) }}复制代码41. 链表题:怎样检测链表中是否有环?怎样删除链表中即是某个值的全部节点?
怎样检测链表中是否有环?
public class ListNode { public var val: Int public var next: ListNode? public init(_ val: Int) { self.val = val self.next = nil }}extension ListNode { var hasCycle: Bool { var slowistNode? = self var fast = self.next while fast != nil { if slow! === fast! { return true } slow = slow?.next fast = fast?.next?.next } return false }}复制代码
怎样删除链表中即是某个值的全部节点?
func remove(with value:Int, from listNodeistNode?) -> ListNode? { let tmpNode = ListNode(0) tmpNode.next = listNode var currentNode = tmpNode.next var persiousNodeistNode? = tmpNode while currentNode != nil { if let nodeValue = currentNode?.val, nodeValue == value { persiousNode?.next = currentNode?.next }else { persiousNode = currentNode } currentNode = currentNode?.next } return tmpNode.next}复制代码42. 数组题:如安在有序数组中找出和即是给定值的两个元素?怎样合并两个有序的数组之后保持有序?
如安在有序数组中找出和即是给定值的两个元素?LeetCode第167题
func twoSum(_ numbers: [Int], _ target: Int) -> [Int] { var i = 0, j = numbers.count - 1 while i < j { let sum = numbers + numbers[j] if sum == target { return [i + 1, j + 1] }else if sum > target { j -= 1 }else { i += 1 } } return []}复制代码
怎样合并两个有序的数组之后保持有?LeetCode第88题
func merge(_ nums1: inout [Int], _ m: Int, _ nums2: [Int], _ n: Int) { for i in stride(from: n + m - 1, to: n - 1, by: -1) { nums1 = nums1[i - n] } var i = 0, j = 0 while i < m && j < n { if nums1[n + i] > nums2[j] { nums1[i + j] = nums2[j] j += 1 }else { nums1[i + j] = nums1[n + I] i += 1 } } while i < m { nums1[i + j] = nums1[n + I] i += 1 } while j < n { nums1[i + j] = nums2[j] j += 1 }}复制代码43. 二叉树题:怎样反转二叉树?怎样验证两个二叉树是完全相称的?