iOS 面试算法一览

疫情期间, 很幸运地遇到公司裁员了, 因此有机会尝试一下去认真面试各大厂. 大厂常见的一个套路就是问一道或者两道算法, 作为基本能力的考察. 没有经历这种套路的时候, 可能内心有所忐忑. 自己肉身体验一番, 感觉难度没有想得那么大, 经过准备还是能顺利接住的. 下面是几个大厂的面试题记录及自己的解答.

1 腾讯

最长回文字符串
回文,是正读反读都能一样的字符串。例如“12321”,“abba”。现给一个字符串,找出其中长度最长的回文字符串。当存在长度一样的结果时,返回第一个结果。

解决思路: 1 判断回文字符串; 2 两层 for 循环, 寻找最长字符串; 3 循环处理接收的字符串. 代码如下:

def isHuiWen(str):
    if not len(str):
        return False
    count = len(str)
    if (count%2)==0:
        mid=count//2
        i=mid-1
        j=mid        
    else:
        mid=count//2
        i=mid-1
        j=mid+1
    res = True
    while i>=0 and jlen(res_str):
                res_str = sub_str
    return res_str
while True:
    a = input()
    res = get_max_str(a)
    print(res)
2 网易

2.1 链表翻转?
解决方式1

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

def reverse_node(n):    
    if not n:
        retun None
    pre = None
    h = n
    while h:
        h2 = h.next
        h.next = pre
        pre = h
        h = h2
    return pre

解决方式2: 使用递归方式

def reverse_node(n):        
    # 递归实现
    if not n.next:
        return n
    else:
        last = rever_node(n.next)
        n.next.next = n
        n.next = None
        return last

2.2 删除链表中倒数的某个节点

def del_node(node, n):
    if not node: 
        return None    
    h1 = node 
    h2 = node
    while n > 0:
        h1 = h1.next
        n -= 1
    while h1.next:
        h1 = h1.next
        h2 = h2.next
    h2.next = h2.next.next
    return node
3 快手

字符串匹配。匹配字符串中:?表示一个字符;表示多个字符或者没有字符。给定一个匹配字符串和一个字符串,判断二者是否匹配。比如 输入“?a”和“ba”,返回True,输入“?a*”和“bb”,返回False 快手
解决方式, 采用递归的思想:

def find_match(str, exp):
    # .代表一个
    # * 代表前面有 0个 或者 多个
    if len(str) == 0 and len(exp) == 0:
        return True
    if len(str) == 0:
        if exp[0] == "*":
            return True
        else:
            return False
    if len(exp) == 0:
        return True
    
    if exp[0] == ".":
        return find_match(str[1:], exp[1:])
    elif exp[0] == "*":
        return find_match(str, exp[1:])
    elif exp[0] == str[0]:
        return find_match(str[1:], exp[1:])
    else:
        return False
4 百度

4.1 链表成环判断?

def is_circle(node):
    if not node:
        return False
    l1 = node
    l2 = node
    res = False
    while l1.next != None and l2.next != None:
        l1 = l1.next
        if l2.next.next:
            l2 = l2.next.next
        if l1 == l2:
            # print(l1.value, l2.value, sep="**")
            res = True
            break
    return res

由链表成环判断, 能够延伸到寻找成环入口节点:

def get_circle_begin(node):
    if not node:
        return None
    l1 = node
    l2 = node
    res = False
    while l1.next != None and l2.next != None:
        l1 = l1.next
        if l2.next.next:
            l2 = l2.next.next
        if l1 == l2:
            res = True
            break
    if res:
        l1 = node
        while l1.next != None and l2.next != None:
            if l1 == l2:
                return l1
            l1 = l1.next
            l2 = l2.next
    return None

4.2 链表共同节点

def common_node(n1, n2):
    if not n1 or not n2:
        return
    def get_length(node):
        if not node:
            return -1
        count = 0
        while node:
            count += 1
            node = node.next
        return count
    l1 = get_length(n1)
    l2 = get_length(n2)
    inter_count = l1 - l2

    if inter_count > 0:
        while l2:
            if l1 == l2:
                print(l1.value)
            l2 = l2.next
    else:
        while l1:
            if l1 == l2:
                print(l1.value)
            l1 = l2.next
5 京东

快排

def quick_sort(nums, left, right):
    if left < right:
        index = get_index(nums, left, right)
        quick_sort(nums, left, index - 1)
        quick_sort(nums, index + 1, right)
def get_index(nums, left, right):
    base = nums[left]
    i, j = left, right
    while i < j :
        '''直到不满足'''
        while i < j and nums[j] > base:
            j -= 1
        nums[i] = nums[j]
        while i < j and nums[i] < base:
            i += 1
        nums[j] = nums[i]
    nums[i] = base
    return i

以上的算法都是 python3 实现的, 使用 VSCode 进行 python3 编程, 感觉能很快上手. 而且机器学习库众多和上手简单的原因, 学习 python 的人越来越多了. 回到算法本身, 使用哪种语言实现都是一样的, 关键是解决的思路. 做算法是一个很有意思的过程, 就像在学校解决数学题一样, 能够忘我的投入时间, 而且解决出来后内心收获感很强. 一轮大厂的体验下来, 算法其实并不难, 用心从头到尾梳理一下数组\链表\树的问题, 基本能够hold大部分场景. 在一个有心前辈整理的算法项目中, 我加入了所有 python3 的实现: awesome-algorithm-question-solution. 希望能帮助到需要的朋友.

喜欢和关注都是对我的鼓励和支持~

你可能感兴趣的:(iOS 面试算法一览)