zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题

2023-09-14 09:04:45 时间

ML岗位面试:上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题

Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题

导读:其实,考察的知识点,博主都做过,但是,emmm,这些知识点,在我写代码中,几乎不会用到,so,会遗忘。所以,还需要下功夫,去多回忆回忆啦。
         整个过程很nice。

目录

数据结构相关问题

1、生成斐波那契数列—yield的应用

2、八皇后问题

3、两种LCS问题——最长公共子序列和最长公共字符串


​​​​​​​

数据结构相关问题

1、生成斐波那契数列—yield的应用

考察点yield

1、yield的特点
(1)、带有 yield 的函数是生成器:带有 yield 的函数在 Python 中被称之为 generator生成器,当使用一个yield的时候,对应的函数就是一个生成器了。成器对象可以被for循环迭代,也可以手动执行next或者send方法精准控制这个生成器的内部执行,
(2)、yield是一个类似 return 的关键字:迭代一次遇到yield时,就返回yield后面(右边)的值。yield就是 return 返回一个值,并且记住这个返回的位置下次迭代就从这个位置后(下一行)开始

2、yield的两大函数
next:next方法就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的。next方法第一次调用a.next()无法输出参数,以后每次a.next(赋值)都等于函数体里面yield表达式的值。
send:send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互。
注意
(1)、当send方法的参数为None时,它与next方法完全等价。但是注意,虽然这样的代码可以接受,但是不规范。所以,在调用send方法之前,还是先调用一次next方法为好。
(2)、其实next和send在一定意义上作用是相似的,区别是send可以传递yield表达式的值进去,而next不能传递特定的值,只能传递None进去。因此,我们可以看做c.next 和 c.send(None) 作用是一样的。

3、yield的应用:需要节约内存不需要一把全部返回,每次使用的时候再去算,我们就会用到生成器。
       在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行。而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b      # 使用 yield
        a, b = b, a + b 
        n = n + 1
        
for n in fab(5): 
    print(n)

2、八皇后问题

     八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后不能处于同一行同一列同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
考察点:考察结构性编程的能力
理解:在8行8列的棋盘上摆放8个皇后,使之不能互相攻击——任意两个不在同一行、同一列或同一斜线上。典型的回溯算法。
首先,我们要想到某种方法来解决冲突检测问题,即不能令棋子处于能相互吃掉的位置——相邻、左右、对角线。
其次,运用回溯的方法,求得问题的解。此处具体为函数的递归调用,当调用到棋盘的最后一行,便跳出,求得解。|
最后,将解打印出来。难点在于对递归调用函数的理解。

1、python八行代码简单实现的八皇后问题

def queen(lists, current=0):    #current当前状态
    if current == len(lists):
        print(lists)
        return 0
    for col in range(len(lists)):     #外for循环
        lists[current], flag = col, True          #列表内赋值,初始化标记
        for row in range(current):            #内for循环取出每一行,if判断,同列或者对角线,标记为false,且跳出当前层的for循环
            if lists[row] == col or abs(col - lists[row]) == current - row: 
                flag = False
                break
        if flag:                          #if判断,合法位置才进行递归调用
            queen(lists, current+1)
res=queen([None]*8)

2、利用yield函数实现的八皇后问题

 Algorithm:【Algorithm算法进阶之路】之利用yield函数解决八皇后问题

3、两种LCS问题——最长公共子序列和最长公共字符串

Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离