数据结构与算法(下)

3.1.17 快速排序

【考点映射】
  • 排序
  • 分治法
【出现频度】★★★★☆
【难度】★★★☆

【参考答案】
快速排序(Quick Sort)使用分治法策略。它的基本思想是:在数据序列中选择一个元素作为基准值,每躺从数据序列的两端开始交替进行,将小于基准值元素交换到序列前端,将大于基准值的元素交换到序列后端,介于两者之间的位置则成为基准值的最终位置。同时,序列被划分成两个子序列,再分别对两个子序列进行快速排序,直到子序列长度为1,则完成排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
动画图解:
代码示例(Python):
def quick_sort(lists, left, right):
    '''
    快速排序(升序)【不稳定】
    原理:
    分治递归,给定一组序列,把序列分为两部分,前部分的所有元素比后部分的所有元素小,然后再对前后两部分进行快速排序,递归该过程,直到所有记录
    均有序为止。分三步走:
    (1)分解,array[m,...,n] 划分成 array1[m,..,k] 和 array2[k+1,...,n], 其中 array1 所有元素 < array2 所有元素
    (2)递归求解,递归array1, array2
    (3)合并,array[m,...,n] 自动排好序

    :param lists:
    :param left:
    :param right:
    :return lists:
    '''
    if left >= right:
        return lists
    key = lists[left]
    low = left
    high = right
    while left < right:
        while left < right and lists[right] >= key:
            right -= 1
        lists[left] = lists[right]
        while left < right and lists[left] <= key:
            left += 1
        lists[right] = lists[left]
    lists[right] = key
    quick_sort(lists, low, left - 1)
    quick_sort(lists, left + 1, high)
    return lists

if __name__ == '__main__':
    # 测试代码
    lst = [5, 4, 3, 2, 1]
    # 调用归并排序
    sorted_list = quick_sort(lst, 0, len(lst) - 1)
    print(sorted_list)
    # 输出:[1, 2, 3, 4, 5]


3.1.18 斐波那契数列

【考点映射】
  • 递归
  • 循环
【出现频度】★★★☆
【难度】★★
【题目描述】
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…… 基于python用多种方式,找到前n项斐波那契数列或找到第n项斐波那契数列的值。

【参考答案】
下面介绍3种解法:
解法一:递归法
递归法主要的好处在于,算法思路比较清晰,我们都知道除了前2个数之外,其他数都是由它的前两个数相加而得到。但是通过递归,我们只能获取第n项斐波那契数列的值,却难以得知前n项数列元素分别是什么。
解法二:迭代法
迭代法可以用一个列表,可以把前n项的斐波那契数列的数值都存储起来,这样我们就可以知道前n项数列元素都有哪些。但是假如n特别大,对于内存的占用也会较高。
解法三:升级版迭代法
可以用生成器代替列表,因为生成器不会把值都存入到内存中,仅当用到时才会动态计算,所以对于内存的占用会小很多。
代码示例(Python):
# (1)递归法 返回 idx 位的数值,缺点:只能返回最终返回值
def fib_recursion(idx):
    if idx <= 2:
        return 1
    else:
        return fib_recursion(idx-1) + fib_recursion(idx-2)

# (2)迭代法 返回 idx 位之前的fib数列
def fib_iteration(idx):
    lst = []
    n,a,b = 0,0,1
    while n < idx:
        lst.append(b)
        a,b = b, a+b
        n += 1
    return lst

# (3)生成器法
def fib_generator(idx):
    n,a,b = 0,0,1
    while n < idx:
        yield b
        a,b = b, a+b
        n += 1

if __name__ == '__main__':
    idx = 6 
    # 递归法调用
    numb = fib_recursion(idx)
    print(numb)
    # 输出: 8
    
    # 迭代法调用
    lst = fib_iteration(idx)
    print(lst)
    # 输出: [1, 1, 2, 3, 5, 8]
    
    # 生成器法
    lst1 = fib_generator(idx)
    print(list(lst1))
    # 输出: [1, 1, 2, 3, 5, 8]


3.1.18 丑数

【考点映射】
  • 动态规划
【出现频度】★★☆
【难度】★★★☆
【题目描述】
只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。一般地,认为1是第一个丑数,1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18是最前面的13个丑数

【参考答案】
原理:本题可采用动态规划思想解题。后面的丑数一定是由前面的丑数乘以2、3或5得到。
所以第n个丑数一定是由前n-1个数中的某3个丑数(分别记为index2、index3、index5)分别乘以2、3或者5得到的数中的最小数,index2,index3,index5有个特点,即分别乘以2、3、5得到的数一定含有比第n-1个丑数大(可利用反证法:否则第n-1个丑数就是它们当中的一个)最小丑数,即第n个丑数由u[index2]2、u[index3]3、u[index5]*5中的最小数得出。让它们分别和第n个丑数比较,若和第n个丑数相等,则更新它们的值。
注:一次最少更新一个值(如遇到第n个丑数是6时,index2和index3都要更新)。
代码示例(Python):
def ugly_num(n):
    # 边界值判

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

测试岗笔面试真题宝典 文章被收录于专栏

测试工作无非就是点点点,没有太深的技术难度?<br/> 开发转投测试岗,原以为自身的条件能轻松胜任测试岗却反被面试官虐?<br/> 测试岗究竟要准备哪些技术知识去应对面试?<br/> 如何才能在测试岗面试中做到游刃有余?<br/> <p> <span>本专刊从测试岗面试考察的知识点和能力出发,精选出经典的测试岗面试题,不仅给出面试的典型回答和考点分析,还会剖析知识点,将其讲清讲透,让你彻底领悟题目背后所考察的能力,帮你梳理复习测试岗的知识体系。</span> </p> <h3> <span><br /> </span><span><strong>专刊主要分为3大模块:</strong></span> </h3> <p> <span>1. 岗位校招情况介绍:</span> </p> <p> <span>将对整个测试岗位进行详细的介绍,包括测试岗位的分类、市场需求量、薪资情况和校招概况,都会逐一做介绍,让同学们能对测试岗位的校招情况有个大概的了解<br /> 2. 面试考点和面试题讲解:</span> </p> <p> <span>这是本章最为核心的部分,将会以面试题讲解的形式,不仅给出面试题参考答案,还会对考点进行分析,剖析其中的知识点,把知识点讲清讲透,帮助同学们梳理复习测试岗的知识体系。本章涉及的知识板块有:软件测试基础知识、测试用例设计、排查问题的思路、常用的测试工具、计算机操作系统、计算机网络、编程语言和常考的智力题。内容丰富,基本上涵盖了测试面试常考的知识点。<br /> 3. 求职经验分享:</span> </p> <p> <span>本章将详细讲解面试的注意事项:从面试前的准备、面试当天到面试结束收到offer整个过程,都会进行逐一讲解。</span> </p> <p> <span><br /> </span> </p> <h3> <span>专刊大纲:</span> </h3> <p> <span><img src="https://uploadfiles.nowcoder.com/images/20210625/691666214_1624592824918/B4749CDE6B040FF304C11BA36D1276D5" alt="" width="700" height="1692" title="" align="" /><br /> <br /> </span> </p> <h3> <span>购买须知:</span> </h3> <span>①订阅成功后,用户即可通过牛客网 PC 端、App 端享有永久阅读的权限;<br /> ②牛客专刊为虚拟内容服务,订阅成功后概不退款;<br /> ③在专刊阅读过程中,如有任何问题,可在文章评论区底部留言,或添加牛客求职导师,加入读者交流群;<br /> ④想成为牛客作者,请邮件联系pandengfeng@nowcoder.com,邮件主题【牛客作者+写作方向】,并附上个人简历一份及近期作品一份;<br /> ⑤牛客专刊版权归本平台所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布 / 发表,违者将依法追究责任。<br /> </span> <p> <span>了解专刊更多详细信息,请扫码添加丸子老师微信~</span> </p> <p> <br /> </p> <p> <img src="https://uploadfiles.nowcoder.com/images/20210526/999991364_1622023901811/2E767EB5BD55BF57B67C8E5427B978D8" alt="" /> </p>

全部评论

相关推荐

有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务