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

简介: Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种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与字符串编辑距离


相关文章
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
133 4
|
5月前
|
机器学习/深度学习 算法
【机器学习】过拟合和欠拟合怎么判断,如何解决?(面试回答)
本文介绍了如何通过观察训练误差和验证误差来判断模型是否出现过拟合或欠拟合,并提供了相应的解决方案,包括增加数据、调整模型复杂度、使用正则化技术等。
500 1
|
3月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
5月前
|
机器学习/深度学习 自然语言处理
【机器学习】如何进行中文命名实体识别?(面试回答)
中文命名实体识别的基本概念、分类、识别思想、实体标注方法以及常见的识别方法,包括基于规则、基于统计和基于深度学习的方法。
65 1
【机器学习】如何进行中文命名实体识别?(面试回答)
|
5月前
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
111 4
|
5月前
|
机器学习/深度学习 算法 Python
【机器学习】面试问答:决策树如何进行剪枝?剪枝的方法有哪些?
文章讨论了决策树的剪枝技术,包括预剪枝和后剪枝的概念、方法以及各自的优缺点。
73 2
|
5月前
|
机器学习/深度学习 算法
【机器学习】SVM面试题:简单介绍一下SVM?支持向量机SVM、逻辑回归LR、决策树DT的直观对比和理论对比,该如何选择?SVM为什么采用间隔最大化?为什么要将求解SVM的原始问题转换为其对偶问题?
支持向量机(SVM)的介绍,包括其基本概念、与逻辑回归(LR)和决策树(DT)的直观和理论对比,如何选择这些算法,SVM为何采用间隔最大化,求解SVM时为何转换为对偶问题,核函数的引入原因,以及SVM对缺失数据的敏感性。
93 3
|
5月前
|
机器学习/深度学习
【机器学习】面试题:LSTM长短期记忆网络的理解?LSTM是怎么解决梯度消失的问题的?还有哪些其它的解决梯度消失或梯度爆炸的方法?
长短时记忆网络(LSTM)的基本概念、解决梯度消失问题的机制,以及介绍了包括梯度裁剪、改变激活函数、残差结构和Batch Normalization在内的其他方法来解决梯度消失或梯度爆炸问题。
214 2
|
5月前
|
机器学习/深度学习 算法
【机器学习】简单解释贝叶斯公式和朴素贝叶斯分类?(面试回答)
简要解释了贝叶斯公式及其在朴素贝叶斯分类算法中的应用,包括算法的基本原理和步骤。
86 1
|
5月前
|
机器学习/深度学习 算法 数据挖掘