在函数返回值的位置使用some protocol 表示返回某一个特定的类型。这个类型对方法调用者不可见,但是保留了类型信息。如下代码的makeTrapezoid函数的返回值就是透明类型。protocol Shape { func draw() -> String } struct Triangle: Shape { var size: Int func draw() -> String { var result: [String] = [] for length in 1...size { result.append(String(repeating: "*", count: length)) } return result.joined(separator: "\n") } } struct FlippedShape<T: Shape>: Shape { var shape: T fun

同时有多个访问访问同一块内存,其中一个是写访问。就会出现内存冲突。出现冲突需要满足3个条件:至少一个是写访问或者非原子操作访问同一块内存访问时间有交叉inout修饰函数参数带来的冲突inout参数是一个长时写访问,访问从所有的非inout参数被评估之后开始,到函数执行完毕。把一个外部变量a作为参数传递给函数,然后在函数内读a,就会发生冲突,此时a有两个访问,一个读,一个写。满足出现冲突的3个条件把同一个变量作为参数传递给一个函数的多个inout参数。同一个变量就是同一块内存,多个inout参数 就是多个写访问,在一个函数里,所以在同一时间。满足冲突3条件struct的mutating函数会对self有写访问。所以调用struct的mutating函数会有机会出现冲突。比如sturct A有一个mutating func函数,这个函数有一个inout参数,这个参数就是struct A 类型,a是 A的一个实例,然后调用函数func时,把a作为参数。这会儿就会出现冲突。访问property时也会出现,因为struct, tuple,enumeration等类型是值类型,所以访问其中的per

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。思路:假设二叉树为root,指定的两个节点分别为p,q。三种情况,如果p,q分别位于root的两侧,则root就是答案,如果位于一侧,则递归。具体递归代码,递归出口条件为root为nullptr,或者root==p或者root==q时,返回root。然后分别求左右子树中,p和q的公共祖先。结果分别为left和right,如果left、right都有值,则答案为root。如果只有一个有值,则答案为有值的那个代码:class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(!root || root == p || root == q) return root; TreeNode* l = lowestCommonAncestor(root->left,p,q); TreeNode* r = lowestCommonAncesto

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。思路:假设根节点为root,指定的两个节点分别为p,q。如果p和q分别位于root的两侧,则答案就是root。如果p,q都位于root左侧,令root=root->left,如果p,q都位于root右侧,令root=root->right。代码:class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root == nullptr) return nullptr; int left = p->val; int right = q->val; if(left > right) { swap(left,right); } if(root->val >= left && root->val <

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。思路:模拟,从头扫描,如果一开始遇到空格,跳过,如果是非数字字符和加减号,则直接返回0。如果遇见加减号和数字字符,则开始记录数字。再次遇到非数字字符则停止扫描。代码:class Solution { public: bool isStart(char c) { if(c >= '0' && c <= '9' || c == '+' || c == '-') { return true; } return false; } bool isValidDigit(char c) { if(c >= '0' && c <= '9') { return true; } return false; } int strToInt(string str) {