
数据结构算法
lemon *
仰望星空,脚踏实地
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法:合并两个有序列表
1.给定两个有序列表,l1=[1,5,7,10],l2=[2,3,4,11],把他们合并成一个有序列表2.方法一:def merge_sort(l1,l2): i,j = 0,0 result = [] while i < len(l1) and j <len(l2): if l1[i]< l2[j]: result.append(l1[i]) i += 1 else:原创 2021-05-29 17:04:00 · 1014 阅读 · 0 评论 -
算法:如何统计字符串中连续的重复字符个数
1.用递归的方法实现一个求字符串中连续出现相同字符的最多次数,例如‘a aabbcc’中连续出现‘a‘的次数为3,‘b’为22.代码如下:def getMaxDuppChar(s,startIndex,curMaxLen,maxLen): if startIndex == len(s)-1: return max(curMaxLen,maxLen) if list(s)[startIndex] == list(s)[startIndex + 1]: re原创 2021-05-19 21:17:32 · 3824 阅读 · 0 评论 -
算法:如何实现字符串的匹配
1.给定主字符串S与模式字符串P,判断P是否是S的子串,如果是,那么找出P在S中第一次出现的小标2.代码如下:def match(s,p): if s == None or p == None: return None slen = len(s) plen = len(p) if slen < plen: return -1 i, j = 0, 0 while i < slen and j < plen:原创 2021-05-07 22:20:31 · 235 阅读 · 0 评论 -
算法:如何消除字符串的内嵌括号
1.给定一个如下格式的字符串,(1,(2,3),(4,(5,6),7)),括号内的元素可以是数字,也可以是另一个括号,实现一个算法消除嵌套的括号,例如把上面的表达式变成(1,2,3,4,5,6,7),如果表达式有误,那么报错2.代码如下:def removeNestedPare(strs): if strs == None: return None #用来记录不匹配的(出现的次数 Parentheses_num = 0 if list(strs)[0] !原创 2021-05-06 20:17:06 · 354 阅读 · 0 评论 -
算法:如何判断两个字符串为换位字符串
1.换位字符串是指组成字符串的字符相同,但位置不同,例如:由于字符串“aaaabbc”与字符串‘abcbaaa’就是由相同的字符组成的,因此他们是换位字符串2.代码如下:def compare(s1,s2): result = True bCount = [None] * 256 for i in range(256): bCount[i] = 0 for i in range(len(s1)): bCount[ord(list(s1)[i原创 2021-04-29 20:52:23 · 639 阅读 · 0 评论 -
算法:如何对磁盘分区
1.有n个磁盘,每个磁盘大小为D[i](i=0…N-1),现在要在这N个磁盘上‘顺序分配’M个分区,每个分区大小为P[j] (j=0…M-1),顺序分配的意思是:分配一个分区P[j]时,如果当前磁盘剩余空间足够,则在当前磁盘分配,如果不够,则尝试下一个磁盘分配,直到找到一个磁盘D[k+1]可以容纳该分区,分配下一个分区P[j+1]时,则从当前磁盘D[i+k]的剩余空间开始分配,不使用D[i+k]之前磁盘未分配的空间,如果这M个分区不能在这N个磁盘完全分配,则任务分配失败,举例:[120,120,120],分原创 2021-04-21 21:53:41 · 442 阅读 · 0 评论 -
算法:如何对任务进行调度
1.假设有一个中央调度机,有n个相同的任务需要调度到m台服务器上去执行,由于每台服务器配置不一样,因此,服务器执行一个任务所花费的时间也不同,第i个服务器执行一个任务所花费的时间也不同。现在假设第i个服务器执行一个任务所需要的时间为t[i]。例如:有两个执行机a与b,执行一个任务分别需要7min,10min,有6个任务待调度,如果平分这6个任务,即a与b各三个任务,则最短需要30min执行完,如果a分4个任务,b分2个任务,则需要28min执行完。请设计一个调度算法,使得所有的任务完成所需要的时间最短。输入原创 2021-04-21 21:26:28 · 1153 阅读 · 0 评论 -
算法:如何从三个有序数组中找出他们的公共元素
1.给定以非递减排序的三个数组,找出这三个数组中的所有公共元素,例如,给出三个数组,arr1 = [,2,5,12,20,45,85],arr2=[16,19,20,85,200],arr3=[3,4,15,20,39,72,85,190],那么这三个数组的公共元素为[20,85]2.解析:方法一,可以找出两个数组的交集存为临时数组,再求临时数组与第三个数组的交集。方法二:假设当前遍历的三个数组元素分别为arr1[i],arr2[j],arr3[k],则存在以下几种可能性,(1)如果arr[i],arr原创 2021-04-17 21:26:12 · 1610 阅读 · 0 评论 -
算法:如何寻找最多的覆盖点
1.坐标轴上从左到右依次的点为a[0],a[1],a[2]到a[n-1],设一根木棒的长度为L,求L最多能覆盖坐标轴的几个点?2.本题要求满足a[j]-a[i]<=l并且a[j+1]-a[I]>L,这两个条件的j与i中间的所有点数中最大值,即j-i+1最大,可以直接从左到右扫描,使用两个索引i,和j,i从0开始,j从位置1开始,如果a[j]-a[i]<=L,则j+前进,并记录中间经过的点的个数,如果a[j]-a[i]>l,则j-回退,覆盖点个数-1,回到刚好满足条件的时候,将满足条原创 2021-04-15 21:43:01 · 741 阅读 · 0 评论 -
算法:如何在有规律的二维数组中进行高效的数据查找
1.在一个二位数组中,每一行都按照从左到右的递增顺序排序,每一列都按照从上到下递增的顺序排序,请实现一个函数,输入这样的一个二位数组和一个整数,判断数组中是否含有该整数,例如下面二位数组就是符合这种约束条件,如果在这个数组中查找数字7,由于数组中含有该数字,则返回True,如果在这个数组中查找数字5,由于数组中不含有该数字,则返回False.1 2 8 92 4 9 124 7 10 136 8 11 152.分析:一原创 2021-04-15 21:04:34 · 477 阅读 · 0 评论 -
算法:如何求数组中两个元素的最小距离
给定一个数组,数组中含有重复元素,给定两个数字num1 和num2,求这两个数字在数组中出现的位置的最小距离代码如下:def mindistance(arr,num1,num2): if arr == None or len(arr) <= 0: return mindist = 2 ** 32 dist = 0 for i in range(len(arr)): if arr[i] == num1: fo.原创 2021-04-13 19:46:11 · 396 阅读 · 0 评论 -
算法:如何找出数组中丢失的数
1.给定一个由n-1个整数组成的未排序的数组序列,其元素都是1到n中的不同整数,请写出一寻找数组序列中缺失整数的线性时间算法2.代码如下:def get_num(array): if array == None or len(array) <= 0: return None suma = 0 sumb = 0 for i in range(len(array)): suma += array[i] if array[i原创 2021-04-12 21:06:10 · 916 阅读 · 0 评论 -
算法:如何在二叉树中找出与输入整数相等的所有路径
1.分析:可以通过遍历二叉树找出所有路径,然后判断各条路径上所有节点的值的和是否与给定的整数相等,如果相等,打印出这条路径,具体实现方法可以通过对二叉树进行先序遍历来实现,实现思路为:对二叉树进行先序遍历,把遍历路径记录下来,当遍历到叶子节点时,判断当前的路径上所有节点的数据的和是否等于给定整数,如果相等则输出路径信息2.代码如下:class Node(): def __init__(self): self.data = None self.left = None原创 2021-04-09 09:00:18 · 458 阅读 · 1 评论 -
算法:如何判断一个数组是否是二叉查找树后续遍历的序列
1.输入一个整数数组,判断该数组是否是某二叉查查找树的后续遍历。2.分析解答:二叉查找树的特点是任意结点的值都比该结点的左子树的值大,比右子树值小,根据这个特点以及后续遍历的特点,这个序列的最后一个结点一定是树的根结点,3.代码如下:def IsAfterOrder(arr,start,end): if arr == None: return False #数组的最后一个结点必定是根结点 root = arr[-1] #找到第一个大于root的值,那么前原创 2021-04-06 22:51:20 · 366 阅读 · 0 评论 -
算法:如何判断两颗二叉树是否相等
1.两可二叉树相等是指这两颗二叉树有着相同的结构,并且在相同位置上的结点有相同的值。2.分析解答:两颗二叉树相等,节点的值相等,左右子树也完全相等,可以使用递归方法实现3.代码如下:class Bitree(): def __init__(self): self.data = None self.left = None self.right = None#判断两颗二叉树是否相等def isEqual(root1,root2): if原创 2021-04-06 20:30:59 · 6118 阅读 · 0 评论 -
算法:如何求一棵二叉树的最大子树和
1.给定一棵二叉树,它的每个节点都是正整数或负整数,如何找到一棵子树,使得它所有节点的和最大2.分析:要求一棵二叉树的最大子树和,最容易想到的办法就是针对每棵子树,求出这棵子树中所有节点的和,然后从中找出最大值,恰好二叉树的后续遍历就能做到这一点,在对二叉树进行后续遍历过程中,如果当前遍历的节点的值与其左右子树和的值相加的结果大于最大值,则更新最大值3.代码如下:class Btree(): def __init__(self): self.data = None原创 2021-04-05 19:52:27 · 980 阅读 · 0 评论 -
算法:如何从顶部开始逐层打印二叉树节点数据
1.给定一颗二叉树,要求逐层打印二叉树节点的数据2.代码如下:from collections import dequeclass BiTNode: def __init__(self): self.data = None self.lchild = None self.rchild = None#把有序数组转化为二叉树def arraytotree(arr,start,end): root = None if end原创 2021-04-05 12:11:38 · 212 阅读 · 0 评论 -
算法:如何把一个有序整数数组放到二叉树中
1.如果把一个有序的整数数组放到二叉树中,那么构造出的二叉树必定是有序二叉树,所以,取数组中间元素作为节点,将数组分成左右两部分,对数组的两部分递归的方法分别构建左右子树2.代码如下:class BiTNode(): def __init__(self): self.data = None self.lchild = None self.rchild = None#把有序数组转换为二叉树def arraytotree(arr,start,en原创 2021-04-05 00:20:45 · 629 阅读 · 0 评论 -
算法:如何从数组中找出满足a+b=c+d的两个数对
1.给定一个数组,找出数组中是否有两个数对(a,b)和(c,d),使得a+b=c+d,其中a,b,c,d是不同的元素,如果有多个答案,打印任意一个即可。例如给定数组:[3,4,7,10,20,9,8],可以找到两个数对,(3,8)和(4,7)2.解题思路:可以使用字典法,算法的主要思路是:以数对为单位进行便利,在遍历过程中,把数对和数对的值存储在字典中,(健为数对的和,值为数对),当便利到一个健值对时,如过它的和在健值对中已经存在,那么就找到了满足条件的健值对3,代码如下:#用来存储数对class原创 2021-04-04 20:35:29 · 1271 阅读 · 0 评论 -
算法:如何从给定的车票中找出旅程
1.给定一趟旅途中所有的车票信息,根据这个车票信息找出这趟旅程的线路,例如给定下面的车票:(‘西安’到‘成都’),(‘北京’到‘上海’),(‘大连’到‘西安’),(‘上海’到‘大连’)。那么可以得到旅程路线为:北京->上海,上海->大连,大连->西安,西安->成都,假定给定的车票不会有坏,一个城市只作为终点不会作为起点2.分析:一般而言可以使用拓扑排序进行解答。根据车票信息构建一个图,然后找出这张图的拓扑排序序列,这个序列就是旅程路线。但这种方法效率不高,它的时间复杂度为O(n),原创 2021-03-30 22:12:34 · 236 阅读 · 0 评论 -
算法:如何实现LRU缓存方案
1.LRU算法,意思是最近最少使用,LRU缓存就是使用这种原理实现的,简单的说缓存一定量的数据,当超过设定的阈值时就把一些缓存过期的数据删除掉。常用于页面置换算法,是虚拟页式存储管理中常用的算法。2.我们可以使用两个数据结构实现一个LRU缓存· 使用双向链表实现的队列,队列的最大容量为缓存的大小。在使用过程中,把最近使用的页面移动到队列头,最近没有使用的页面将被放在队列尾的位置· 使用一个哈希表,把页号作为键,把缓存在队列中的节点的地址作为值,只需要把这个页对应的节点移动到队列的前面,如果需要的页面原创 2021-03-30 21:19:55 · 580 阅读 · 0 评论 -
python如何设计一个排队系统
1.如何设计一个排队系统,能够让每个进入队伍的用户都能看到自己在队列中所处的位置和变化,队伍可能随时有人加入和退出,当有人退出影响到用户的位置排名时需要及时反馈到用户2.排队系统不仅要实现队列的常见的入队和出队功能,而且还要实现队列的中任意的一个元素都可以随时出队列,且出队列需要更新队列用户位置的变化。3.代码如下:from collections import dequeclass User: def __init__(self,id,name): #唯一标识一个用户原创 2021-03-25 22:51:22 · 3129 阅读 · 0 评论 -
python算法:如何用两个栈模拟队列操作
class Stack(): def __init__(self): self.items = [] def empty(self): return len(self.items) == 0 def size(self): return len(self.items) def peek(self): if not self.empty(): return self.items[-1]原创 2021-03-23 21:28:24 · 130 阅读 · 0 评论 -
python算法:如何用O(1)的时间复杂度求栈中最小元素
class Stack: def __init__(self): self.items = [] def empty(self): return len(self.items) == 0 def size(self): return self.items def peek(self): if not self.empty(): return self.items[-1]原创 2021-03-22 23:47:50 · 313 阅读 · 0 评论 -
python算法题:如何根据入栈序列判断可能的出栈序列
1.输入两个序列,其中一个序列表示栈的push(入)序列,判断另一个序列有没有可能是对应的pop(出)序列class Stack: def __init__(self): self.item = [] def empty(self): return len(self.item) == 0 def size(self): return len(self.item) #返回栈顶元素 def peek(self):原创 2021-03-22 23:13:47 · 819 阅读 · 0 评论 -
python实现队列
1.实现一个队列,使其具有入队列,出队列,查看队列收尾元素,查看队列大等功能2.使用列表和链表实现列表实现队列class MyQueue(): def __init__(self): self.arr = [] self.front = 0 #队头 self.rear = 0 #队尾 def isempty(self): return len(self.arr) == 0 def size(self):原创 2021-03-15 21:17:27 · 1553 阅读 · 0 评论 -
栈python实现
1.栈和队列是在程序设计中被广泛使用的两种线性数据结构,都是在一个特定范围的存储单元中存储的数据,与线性表相比,他们的插入和删除有更多的约束和限定,所以又称为限定性的线性表结构。2.队列,先进先出(FIFO),栈后进先出(LIFO)3.实现栈列表实现栈操作class MyStack: def __init__(self): self.item = [] #判断栈是否为空 def is_empty(self): return len(self.原创 2021-03-15 00:38:43 · 390 阅读 · 0 评论 -
链表python实现
1.什么是单链表单链表是链表的一种,其特点是链表的连接方向是单向的,链表是非线性结构,在内存中存储数据是不连续的,单链表是由数据和指向下一个节点的指针组成,指针就是连接每一个节点的内存地址数据,链表在插入,删除一个节点的时候要比数组要快,在查找数据时比比数组慢,链表结构可以充分的利用内存空间,实现内存的动态内存管理class Node(): def __init__(self,value): self.value = value self.next =原创 2021-03-12 15:12:10 · 151 阅读 · 0 评论 -
树的详解及python实现
1.树不是线性结构,是非线性的。2.树在计算机科学里应用广泛,包括操作系统,图形学,数据库和计算机网络等。3.数的术语:·节点 · 树中的每一个元素称为一个节点,节点是树的基本组成部分。· 边 · 边也是树的基本构成部分,边有方向,连接两节节点,并表示他们之间的联系。 · 除了根节点外每个节点都有且有一条与其他节点相连的入边,每个节点有多个出边· 根节点 · 根节点是树中唯一一个没有入边的节点4.树的定义:树是节点和连接节点的边的集合,它有以下特征: ·有一个根节点 ·除了根节点原创 2021-03-06 22:32:18 · 727 阅读 · 0 评论 -
如何设计微信抢红包的算法
过年的时候大家都会在微信群中抢红包,抢的不亦乐乎,抢的多的时候惊喜大笑,抢的少的时候后悔重来,但是抢红包大家每个人抢的多少都是公平的吗?每次抢红包都是随机的吗?今天就来看看这个抢红包算法到底怎么实现。抢红包必须要满足这么几个规则:1.所有人 抢到的金额之和要等于红包金额2.每个人都会抢到钱3. 要保证红包拆分的金额尽可能分布均匀,不能一个人抢了99块钱,另一个抢了1块钱,那玩个锤子呀  原创 2020-09-22 14:02:26 · 1621 阅读 · 0 评论 -
A星寻路算法,附python源码
小时候我们都玩过推箱子,把箱子从一个点推到指定地点,碰到墙的时候就推不动了,这个游戏大家小时候肯定玩的不亦乐乎,废了不少功夫一关一关的过,其实这个游戏用代码实现还是很简单的,今天就给大家讲讲A星寻路算法,A星寻路算法是一种用于寻找有效路径的算法。A星寻路算法需要两个列表和一个公式:open_list——可到达的格子close_list——已走过的格子公式:F = G + H每一个格子都具有F,G,H这3个属性,如图G: 从起点走到当前格子一共走了几步H: 在不考虑障碍的情况下,原创 2020-09-21 16:55:51 · 4087 阅读 · 5 评论 -
python实现各种排序算法
1.快速排序:快排的思想就是拿到要排序列表的第一个元素,经过算法找到它在列表中的排序好后的位置,然后将列表分成左右两个列表,左右两个列表再递归的排序。递归结束条件就是要排序的这个列表只剩1个元素,或0个元素就结束了。left是列表中第一个元素的小标,right是列表中最后一个元素的下标。代码:def quick_sort(arr,left,right): if left <ri...原创 2019-12-18 15:15:20 · 1074 阅读 · 0 评论