面试题总结

Python中格式化输出应该使用%还是format

Python 新版本推荐使用format,Python 2.6才开始支持了format语 法。

c = (100,200)
# print('坐标%s'%c)   #会报错,因为%s只能传入一个值,但是c是一个元组,其中不止一个值。可以改写为print('坐标%s'%(c,))
print('坐标{}'.format(c))

.format()不用考虑传值时参数格式的问题。
Python 3.6加入了一个f-strings新语法。

c = (100,200)
print('坐标{}'.format(c))
print(f'坐标{c}')

同时,format还支持通过位置、关键字、对象属性来进行传参。

排序算法

  1. 冒泡排序(稳定,时间复杂度:O(n^2))
    依次比较相邻两个元素的大小,若前一个元素大于后一元素,则交换,直到最后一个元素即为最大元素。然后重新从首元素开始同样地操作,知道倒数第二个元素即为次大的元素。以此类推,将得到最大或者最小的排序序列。

  2. 选择排序(不稳定,时间复杂度:O(n^2))
    首先初始化最小元素索引值为首元素,依次遍历待排序数列,若遇到小于该最小索引位置元素的,则刷新最小索引为该较小元素的位置,直到到尾元素,结束一次遍历,并将最小索引处的元素与首元素交换;然后初始化最小元素索引为第二个待排序的元素位置,同样操作,可得到倒数第二小的元素,以此类推。

  3. 快速排序(不稳定,时间复杂度:O(nlogn)
    选一基准元素,依次将剩余元素中小于该基准元素的值放置其左侧,大于等于该基准元素的值放置其右侧;然后去基准元素的前半部分和后半部分分别进行同样的处理;以此类推,直至各个子序列剩余一个元素时,即排序完成。

  4. 插入排序(稳定,时间复杂度:O(n^2))
    有一个已经有序的数据序列(可能只有一个元素),依次将后面的无序元素插入到前面的有序数列中,初始状态有序数列仅有一个元素,即首元素。在将无序数列元素插入有序数列的过程中,采用了逆序遍历有序数列,相较于顺序遍历会稍显繁琐,担当数列本身已近排序状态效率会更高。

    已知待排序的一组记录是:
    60,71,49,11,24,3,66
    假设在排序过程中,前3个记录已按关键码值递增的次序重新排列,构成一个有序序列:
    49,60,71
    将待排序记录中的第4个记录(即11)插入上述有序序列,以得到一个新的含4个记录的有序序列。首先,应找到11的插入位置,再进行插入。可以将11放入数组的第一个单元r[0]中,这个单元称为监视哨,然后从71起从右到左查找,11小于71,将71右移一个位置,11小于60,又将60右移一个位置,11小于49,又再将49右移一个位置,这时再将11与r[0]的值比较,11≥r[0],它的插入位置就是r[1]。假设11大于第一个值r[1]。它的插入位置应该在r[1]和r[2]之间,由于60已经右移了,留出来的位置正好留给11.后面的记录依照同样的方法逐个插入到该有序序列中。若记录数n,续进行n-1趟排序,才能完成。

  5. 希尔排序(不稳定,时间复杂度:O(n^(3/2)))
    是插入排序的改进版,为了减少数据的移动次数,在初始序列较大时,去较大的步长,通常序列长度的一半,此时只有两个元素比较,交换一次;之后步长依次减半直至步长为1,即为插入排序,由于此时序列已接近有序,故插入元素是数据移动的次数会相对较少,效率得到了提高。

  6. 归并排序(稳定,时间复杂度:O(nlogn))
    采用分治的思想,分治排序整个数列如同排序两个有序数列,一次执行这个过程直至排序末端的两个元素,再依次向上层输送排序好的两个子列进行排序直至整个数列有序。

    设有数列{6,202,100,301,38,8,1}
    初始状态:6,202,100,301,38,8,1
    第一次归并后:{6,202},{100,301},{8,38},{1}
    第二次归并后:{6,100,202,301},{1,8,38}
    第三次归并后:{1,6,8,38,100,202,301}

方法重载与方法重写有什么区别(Python中没有重载)

方法重载:让类以统一的方式处理不同类型数据的一种手段。
方法重写:父类与子类之间的多态性,对父类的函数进行重新定义。
Python中,方法也是attribute,方法名就是Key,所以每个方法名只能有一个方法体,当一个无参数函数体被定义了多次,每一次新的定义都会覆盖之前的定义,所以,可以在dir()中看到,这个方法最终指向最后一次定义的函数体,所以在调用之前没有参数的函数时,所以会报错。

面向对象的三大特性

  1. 继承
    类可以继承一个或多个父类,或者又可以称为基类或者超类,新建的类称为派生类或子类。
  2. 封装
    广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装,只让用实例化的对象来操作类中属性或者方法。
    狭义上面向对象的封装:将属性和方法都藏起来,不让你看见。
  3. 多态
    多态是指一类事物有多种形态
    实现多态的方法:
    • 定义新的子类
    • 重写对应的父类方法
    • 使用子类的方法直接处理,不调用父类的方法

HTTP和HTTPs

HTTP是超文本传输协议,HTML是超文本标记语言
HTTP:http协议在数据传输的过程中都是明文,所以可能存在数据泄露和篡改。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL/TLS层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
参考链接:http://www.cnblogs.com/wupeiqi/

MVC框架和MTV框架

MVC框架:全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。

Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。

MTV框架:

  • Model(模型):负责业务对象与数据库的对象(ORM)
  • Template(模版):负责如何把页面展示给用户
  • View(视图):负责业务逻辑,并在适当的时候调用Model和Template

在这里插入图片描述

单例模式和工厂模式

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。当想控制实例数目,节省系统资源的时候使用单例模式。主要解决一个全局使用的类频繁地创建与销毁。
工厂模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决接口选择的问题。

二叉树

二叉查找树

二叉查找树,也称有序二叉树,是指一棵空树或者具有以下性质的二叉树:

  1. 左子节点的值比父节点小
  2. 右子节点的值比父节点大
  3. 任意节点的左右子树也分别为二叉查找树
  4. 没有键值相等的点
    在这里插入图片描述

基于BST存在的问题,平衡二叉树产生了,典型的有AVL树和红黑树,因为AVL是严格的平衡二叉树,但是插入和删除的性能较差,所以在实际生产环境中不如红黑树应用广泛。

红黑树

红黑树从本质上来说就是一颗二叉查找树(自平衡二叉树),但是在二叉树的基础上增加了着色相关的性质,使得红黑树可以保证相对平衡,从而保证红黑树的增删改查的时间复杂度最坏也能达到O(log N)。
下面是红黑树最重要的5条性质,后面需要正常回来查看:

  1. 每个节点要么是黑的,要么是红的
  2. 根节点以及叶子节点是黑的
  3. 如果一个节点是红的,他的子节点一定都是黑的
  4. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
    在这里插入图片描述
    当在含n个关键字的红黑树上进行insert和delete操作时,修改后的树可能不满足上面给出的4个红黑树的基本特性,所以需要改变树中的某些节点的颜色以及指针结构。
    这些指针结构的修改是通过旋转完成的,旋转分为左旋和右旋:
    在这里插入图片描述
    参考链接:https://www.jianshu.com/p/0eaea4cc5619

什么是闭包

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值