测开面试 | Python常问算法
1、排序
- 从小到大排序:sorted(list)
- 从大到小排序:sorted(list, reverse=True)
- sort() 方法,改变原有数组的顺序
- sort(reverse=True)
#!/bin/Python
alist = [1, 4, 2, 3, 7, 6]
print(sorted(alist))
print(sorted(alist, reverse=True))
alist.sort()
print(alist)
alist.sort(reverse=True)
print(alist)
2、冒泡
- 1.比较相邻的元素,如果第一个比第二个大,就交换
- 2.一轮遍历,每两个相邻的元素,重复第 1 步,最大的放队尾
- 3.不包括已经排队尾的,重复第 2 步
#!/bin/Python
# -*- coding: UTF-8 -*-
#冒泡排序
def bubble_sort(lists):
#获取数组长度
count = len(lists) - 1
#N个元素遍历N次
for index in range(count, 0, -1):
#第i个和i+1个依次对比
for sub_index in range(index):
#大的元素冒上去
if lists[sub_index] > lists[sub_index + 1]:
lists[sub_index], lists[sub_index + 1] = lists[sub_index + 1], lists[sub_index]
return lists
alist = [1, 4, 2, 3, 7, 6]
print(bubble_sort(alist))
3、快排
- 1.从列表中挑出一个元素,作为基准值 key
- 2.所有小于 key 的元素放左边,所有大于 key 的元素放右边
- 3.分别递归左侧列表,右侧列表
#!/bin/Python
# -*- coding: UTF-8 -*-
#快速排序
def quick_sort(lists, left, right):
#递归过程中,发现left和right一致时,停止递归,直接返回列表
if left >= right:
return lists
#定义游标
low = left
high = right
#取参考标志,最左边的元素
key = lists[low]
while low < high:
#从最右侧向左,依次和标志元素对比,如果右侧的元素大于等于标志元素
while low < high and lists[high] >= key:
#右侧减1
high -= 1
#如果右侧的元素小于标志元素,则low赋high值
lists[low] = lists[high]
#从最左侧向右,依次和标志元素对比,如果左侧的元素小于等于标志元素
while low < high and lists[low] <= key:
#左侧加1
low += 1
#如果左侧的元素大于标志元素,则high赋low值
lists[high] = lists[low]
#最后给high位置赋值
lists[high] = key
#处理左侧元素
quick_sort(lists, left, low - 1)
#处理右侧元素
quick_sort(lists, low + 1, right)
return lists
alist = [0, 10, 88, 19, 9, 1, 7]
print(quick_sort(alist, 0, 6))
4、堆排序
- 堆排序指利用堆的数据结构设计的一种排序算法
- 堆近似于一个完全二叉树结构
- 子节点的键值小于(或者大于)它的父节点
#!/bin/Python
# -*- coding: UTF-8 -*-
#堆排序
def heap_sort(lst):
def sift_down(start, end):
"""最大堆调整"""
root = start
print "root %d start %d end %d" % (root, start, end)
while True:
child = 2 * root + 1
#print "child index: %d" % child
#终止条件,孩子的索引值超过数组最大长度
if child > end:
break
#print "lst child value: %d" % lst[child]
#确定最大的孩子节点的索引值
if child + 1 <= end and lst[child] < lst[child + 1]:
child += 1
#print "child+1 index: %d" % child
#孩子节点最大值和根节点交换
if lst[root] < lst[child]:
lst[root], lst[child] = lst[child], lst[root]
#print "lstroot %d" %d lst[root], "lstchild %d" % lst[child]
root = child
#print "root %d" % root
else:
break
print("---------------创建最大堆---------------")
#创建最大堆
print(xrange((len(lst) - 2) // 2, -1, -1))
for start in xrange((len(lst) - 2) // 2, -1, -1):
print "---->Loop start %d" % start
sift_down(start, len(lst) - 1)
print(lst)
print("---------------排序过程---------------")
#堆排序
for end in xrange(len(lst) - 1, 0, -1):
#首尾交换
lst[0], lst[end] = lst[end], lst[0]
#剩余重新堆排序
sift_down(0, end - 1)
print(lst)
return lst
alist = [70, 60, 12, 40, 30, 8, 10]
print(heap_sort(alist))
5、二分查找
- 二分查找又称折半查找
- 必须采用顺序存储结构
- 必须按关键字大小有序排列
#!/bin/Python
# -*- coding: UTF-8 -*-
#二分查找
#原始数组
alist = [0, 1, 10, 88, 19, 9, 1]
def binary_search(arr, start, end, hkey):
if start > end:
#返回-1,表示程序出现异常
return -1
#先找到数组索引的中间值
mid = start + (end - start) / 2
#如果中间值大于查找的值,则从中间值左边的数组中查找
if arr[mid] > hkey:
return binary_search(arr, start, mid - 1, hkey)
#如果中间值小于查找的值,则从中间值右边的数组中查找
if arr[mid] < hkey:
return binary_search(arr, mid + 1, end, hkey)
#返回查找的值所在的索引值
return mid
#给数组排序
alist = sorted(alist)
#打印出排序后的数组
print(alist)
#执行程序
print binary_search(alist, 0, 6, 9)
6、素数
- 素数又称质数
- 0,1 不是素数
- 除了 1 和它本身外,不能被其他自然数整除的数
#!/bin/Python
# -*- coding: UTF-8 -*-
#素数
def is_prime(n):
#0,1 不是素数
if n <= 1:
return False
#除了 1 和它本身外,不能被其他自然数整除的数
for i in range(2, n):
if n % i == 0:
return False
return True
for i in range(0, 100):
if is_prime(i):
print i
欢迎关注微信公众号"测试开发Stack"
测开面试 | Python常问算法的更多相关文章
- 测开面试 | Python语言常见问题
1.面向对象的概念? 面向对象编程,简称OOP,是一种程序设计思想 主要包括:类.继承.多态(子类方法覆盖父类方法).实例.属性.方法 2.什么是进程.线程.协程? 进程:独立数据空间,进程间不共享数 ...
- 测开之Python自动化全栈工程师+性能专项(送思维导图)
测开之Python自动化全栈工程师+性能专项 功能测试基础 接口测试基础接口的通信原理与本质cookie.session.token详解接口测试的意义与测试方法接口测试用例的设计 app测试 app流 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...
- 面试中常问的List去重问题,你都答对了吗?
面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固. 我们大家都知道,set集合的特点就是没有重复的元素.如果集合中的数据类型是基本 ...
- Android相关面试题---面试官常问问题
版权声明:本文为寻梦-finddreams原创文章,请关注: http://blog.csdn.net/finddreams/article/details/44513579 一般的面试流程是笔试完就 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...
- Java面试中常问的数据库方面问题
MySQL 为什么用自增列作为主键 如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引.如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作 ...
- 面试--hr常问的问题
程序员换工作,会有技术面试(可能不止一轮的技术面),还会有hr的面试,技术面主要是偏向于技术问题,hr面试主要问的一些问题,下面做下汇总: 1.你换工作的原因,你为何辞职 必问的问题,送分题或者送命题 ...
- 聊聊面试中常问的GC机制
GC 中文直译垃圾回收,是一种回收内存空间避免内存泄漏的机制.当 JVM 内存紧张,通过执行 GC 有效回收内存,转而分配给新对象从而实现内存的再利用. JVM GC 机制虽然无需开发主动参与,减轻不 ...
随机推荐
- 《Linux内核原理与分析》教学进程
目录 2019-2020-1 <Linux内核原理与分析>教学进程 考核方案 第一周: 第二周: 第三周: 第四周: 第五周 第六周 第七周: 第八周 第九周 第十周 第十一周: 第十二周 ...
- c#菜单动态合并 z
说明 在程序中经常使用弹出菜单,并且一个窗体中可以存在多个弹出菜单.开发过MDI窗体的读者可能都知道,当MDI子窗体最大化时,子窗体和主窗体的菜单能够自动的合并.这是如何实现的呢?本例实现了将两个弹出 ...
- Java Exception 异常处理
一.定义 异常(Exception) : 是指程序运行时出现的非正常情况,是特殊的运行错误对象,对应着Java语言特定的运行错误处理机制. 二.两大常见的异常类型 • RuntimeException ...
- vue中toggle切换的3种写法
前言:查看下面代码,在任意编辑器中直接复制粘贴运行即可 1:非动态组件(全局注册2个组件,借用v-if指令和三元表达式) <!DOCTYPE html> <html> < ...
- F#周报2019年第24期
新闻 ML.NET 1.1发布与模型构建器升级 .NET Core 3.0预览版6发布 尝试新的System.Text.Json API F#调用Infer.NET 匿名记录类型文档 了解FableC ...
- Beats Elastic中的Auditbeat使用介绍
Auditbeat使用介绍 Auditbeat是一种轻量级的数据收集器,您可以将其安装在服务器上,以审核系统上用户和进程的活动. 例如,您可以使用Auditbeat从Linux Audit Frame ...
- jakarta-oro-2.0.8.jar-----------JAVA FTP相关
资源不好找,找到了就和大家分享一下! 链接:https://share.weiyun.com/51kBB0y 密码:2hcxcu
- Delphi - 16进制取反 Not
//Not直接实现十六进制取反var I, J : word; begin I := $96E5; J := Not I; ShowMessage(Format('%x',[J])); end; 作者 ...
- C typedef、#define
参考链接:https://www.runoob.com/cprogramming/c-typedef.html 作用 typedef是用来为数据类型(可以是各种数据类型,包括自己定义的数据类型如结构体 ...
- webpack篇,结合理论与实际,加以透彻分析!
Webpack篇 开始着手项目打包的一些东西,还不是特别懂,一边学习,一边做笔记好啦. 1.webpack的概念.Webpack 是当下最热门的前端资源模块化管理和打包工具.任何形式的资源都可以视作模 ...