面试整理

网络工程总结

传输层使用TCP/IP协议,应用层使用HTTP,HTTPS协议。
网络协议

iOS基础总结

iOS底层总结

《iOS知识点梳理-Runloop》
《iOS知识点梳理-Runtime》

算法编程面试题

1. 判断一个单向链表是否有环?

  • 快慢双指针法,快指针一次走两步,慢指针一次走一步,如果有环必会相遇
 public class ListNode {
     public var val: Int
     public var next: ListNode?
     public init(_ val: Int) {
         self.val = val
         self.next = nil
     }
 }

func validedCycleNoded(_ node: ListNode?) -> Bool {
    if node == nil {
        return false
    }
    
    var fast = node, slow = node
    
    while fast != nil {
        fast = fast?.next?.next
        slow = slow?.next
        
        if fast?.val == slow?.val {
            return true
        }
    }
    
    return false
}
  • 可以使用集合(Set)来判断,来一次遍历,把所有node添加到集合中,如果有重复,则肯定要有环

2.如何计算二叉树的高度?

递归算法

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public var val: Int
 *     public var left: TreeNode?
 *     public var right: TreeNode?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.left = nil
 *         self.right = nil
 *     }
 * }
 */
class Solution {
    func maxDepth(_ root: TreeNode?) -> Int {
        guard let root = root else {return 0;}  
        return max(maxDepth(root.left), maxDepth(root.right)) + 1
    }
}

3. 合并两个有序数组,同时去重

func mergeSortedArray(_ a: [Int], b:[Int]) ->[Int] {

    var i = 0
    var j = 0
    var ans = [Int]()

    //合并数组
    while i < a.count && j < b.count {
        if a[i] > b[j] {
            ans.append(b[j])
            j += 1
        }else if (a[i] == b[j]) {
            ans.append(b[j])
            j += 1
            i += 1
        }else {
            ans.append(a[i])
            i += 1
        }
    }

     //数组a有未合并元素
    while i < a.count {
        ans.append(a[i])
        i += 1
    }

    //数组b有未合并元素
    while j < b.count {
        ans.append(b[j])
        j += 1
    }

    return ans
}
复制代码

4. 字符串编辑最短距离(LeeCode)

LeeCode-72.编辑距离
解法:动态规划

5. 判断括号的有效性(LeeCode)

LeeCode-20.有效的括号

class Solution {
    func isValid(_ s: String) -> Bool {
     if s.isEmpty {
        return true;
    }

    let map = ["}":"{", ")":"(","]":"["]
    var stack = [String]()

    for c in s {
       let key = String(c)
        if key == "{" || key == "(" ||  key == "[" {
            stack.append(key)
        } else if !stack.isEmpty && map[key] == stack.last {
            stack.removeLast()
        } else {
            return false
        }
    }

    return stack.isEmpty
    }

}
复制代码

6. 25匹马,现有5条跑道,没有计时器,要找出最快3匹马,至少要跑几场?

至少跑7场,

  1. 对25匹马随机分成5个组(A,B,C,D,E,F),每组跑一场,记录每一匹马在当前组中名次(第1名,第2名,第3名)(跑了五场)
  2. 从各个组中选取名次为第一名的马组成一组,跑一场,记录名次(第六场),本组第1名则确定了25匹马中最快的一匹马
  3. 选取第六场中名次为第1名的所在原来组名次为第2、3名马,选取第六场中名次为第2名的所在原来组名次第1、2名马(它自己+第2名),选取第六场中名次为第3名所在原来组名次第1名的马(它自己),组成一组,跑一场,记录名次(第七场),本场的第1、2名就是25匹马中最快的第2、3名

7. 8瓶液体,其中1瓶有毒药,毒药1小时后至死,请问最快找出毒药,需要几只老鼠?

1只老鼠可以断定2瓶液体,2^3=8,所以需要3只老鼠即可,
对液体进行编号,001,010,011,100,101,110,111
给1号老鼠喂编码个位数上是1的液体(001,011,101,111),
给2号老鼠喂编码十位数上是1的液体(010,011,110,111),
给3号老鼠喂编码百位数上是1的液体(100,101,110,111),
1小时后,
如果老鼠全活, 8号液体有毒,
如果全都死,7号液体有毒,
如果1号死,2,3活, 1号液体有毒
如果2号死, 1,3活,2号液体有毒
如果3号死,1,2活, 4号液体有毒
如果1,2号死,3活, 3号液体有毒
如果1,3号死,2活, 5号液体有毒
如果2,3号死,1活, 6号液体有毒

其他

如下结构体,大小是多少?

struct Node {
char a;
int b;
} node;
复制代码
结构体大小是8,考察结构体特性,内存对齐原则。

定义一个全局变量a = 0; 开辟两条子线程访问 a = a + 1; 各for loop 10次,a的最终结果是多少?

<=20,线程安全问题。

公司员工表(user)中有入职时间(t1)和离职时间(t2),请编写sql语句,查询18年3月(date1)-18年6月(date2)所有在职员工人信息

select * from user where 入职时间<201806 and (离职时间 is null or离职时间>201803)。

参考
《2020年疫情之下iOS面试题总结篇》
《tcp协议详解》
《文章3》
《文章4》

你可能感兴趣的:(面试整理)