python数据结构和算法
魇餍
你若盛开,蝴蝶自来
展开
-
如何合并两个有序链表
"""已知两个链表head1和head2各自有序(例如升序排列),请把他们合并成一个链表,要求合并后的链表依然有序。"""class LNode: def __init__(self): self.data = None self.next = Nonedef ConstructList(start): """ 方法功能:构造...原创 2019-01-17 11:11:34 · 237 阅读 · 0 评论 -
如何把链表相邻元素翻转
"""把链表相邻元素翻转,例如给定链表1->2->3->4->5->6->7, 则翻转后的链表变为2->1->4->3->6->5->7"""class LNode: def __init__(self): self.data = None原创 2019-01-16 17:34:13 · 402 阅读 · 0 评论 -
如何实现LRU缓存方案
"""LRU是Least Recently Used 的缩写,他的意思是"最近最少使用",LRU缓存就是用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值是就把一些过期的数据删除掉。常用于页面置换算法,是虚拟页式存储管理中常用的算法。"""from collections import dequeclass LRU: def __init__(self, ca...原创 2019-01-23 10:32:23 · 424 阅读 · 0 评论 -
如何从给定的车票中找到旅程
"""给定一趟旅途旅程中所有的车票信息,根据这个车票信息找到这趟旅程的路线。例如:给定下面的车票:("西安"到"成都"),("北京"到"上海"),("大连"到"西安"),("上海"到"大连")。那么可以获得旅程路线为:北京->上海,上海->大连,大连->西安,西安-&原创 2019-01-23 10:34:44 · 311 阅读 · 0 评论 -
如何从数组中找到满足a + b = c + d的两个数对
class pair: def __init__(self, first, second): self.first = first self.second = seconddef findPairs(arr): # 键为数对的和, 值为对 sumPair = dict() n = len(arr) # 遍历数组中所有可能...原创 2019-01-23 10:36:31 · 873 阅读 · 0 评论 -
如何找出数组中唯一的重复元素
"""数据1~1000放在含有1001个元素的数组中,其中只有唯一的一个元素值重复,其他数字均只出现一次。设计一个算法,将重复元素找出来,要求每个数组元素只能访问一次。如果不使用辅助存储空间,能否设计一个算法实现?"""def findDup(array): if None == array: return -1 lens = len(array) ...原创 2019-01-23 10:37:44 · 591 阅读 · 1 评论 -
如何查找数组中元素的最大值和最小值
"""给定数组a1,a2,a3...an,要求找出数组中的最大值和最小值。假设数组中的值两两各不相同。"""class MaxMin: def __init__(self): self.max = None self.min = None def getMax(self): return self.max def...原创 2019-01-23 10:59:09 · 3265 阅读 · 0 评论 -
如何实现旋转数组
"""把一个有序数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转。例如数组【4,5,1,2,3】为数组【1,2,3,4,5】的一个旋转。"""def swap(arr, low, high): # 交换数组low 到high的内容 while low < high: tmp = arr[low] arr[low] = arr[h...原创 2019-01-23 13:40:46 · 346 阅读 · 0 评论 -
如何找出数组中丢失的数
"""给定一个有n-1个整数组成的未排序的数组序列,其元素都是1到n中的不同的整数。请写出一个寻找数组序列中缺失整数的线性时间算法。"""def getNum(arr): if arr is None or len(arr) <= 0: print('参数不合法') return -1 a = arr[0] b = 1 ...原创 2019-01-23 13:53:37 · 798 阅读 · 0 评论 -
如何找出数组中出现奇数次的数
"""数组中有N + 2个数,其中,N个数出现了偶数次,2个数出现了奇数次(这两个数不相等),找出这两个数。注意:不需要知道具体位置,只需要找出这两个数。"""def get2Num1(arr): """ 这种方法对数组进行一次遍历,时间复杂度为O(n),但是申请了额外的存储过程来记录数据出现的情况,因此,空间复杂度为O(n)。 """ if ar原创 2019-01-23 14:51:25 · 1353 阅读 · 0 评论 -
如何求数组中两个元素的最小距离
"""给定一个数组,数组中含有重复元素,给定两个数字num1和num2,求这两个数字在数组中出现的位置的最小距离。"""# 蛮力法 时间复杂度O(n2)def minDistance1(arr, num1, num2): if arr is None or len(arr) <= 0: print('参数不合理') return 2 ** ...原创 2019-01-23 15:12:33 · 899 阅读 · 0 评论 -
如何求数组中绝对值最小的数?
"""有一个升序排列的数组,数组中可能有正数,负数或0,求数组中元素的绝对值最小的数。例如,数组【-10,-5,-2,7,15,50】,该数组中绝对值最小的数是2"""def fingMin1(array): if array == None or len(array) < 0: print("输入参数不合理") return 0 ...原创 2019-02-20 14:24:17 · 1985 阅读 · 0 评论 -
如何求数组连续最大和
"""一个有n个元素的数组,这n个元素即可以是正数也可以是负数,数组中连续的一个或多个元素可以组成一个连续的子数组,一个数组可能有多个这种连续子数组,求子数组和的最大值。例如,对于数组[1,-2,4,8,-4,7,-1,-5]而言,其最大和的子数组为[4,8,-4,7],最大值为15."""def maxSubArray1(arr): if arr == None or len...原创 2019-02-20 14:44:26 · 1210 阅读 · 0 评论 -
如何将单链表向右旋转k个位置
"""给定单链表1->2->3->4->5->6->7,k=3,那么旋转后的单链表变为5->6->7->1->2->3->4"""class LNode: def __init__(self): self.data = None sel原创 2019-01-16 17:07:27 · 521 阅读 · 0 评论 -
如何找到单链表中的倒数第k个元素
"""找到单链表中的倒数第k个元素, 例如给定单链表:1-&gt;2-&gt;3-&gt;4-&gt;5-&gt;6-&gt;7,则单链表的倒数第k=3个元素为5."""class LNode: def __init__(self): self.data =原创 2019-01-16 16:23:04 · 588 阅读 · 0 评论 -
如何对链表进行重新排序
"""给定链表L0->L1->L2...Ln-1->Ln, 把链表重新排序为L0->Ln->L1->Ln-1->L2...。要求:(1)在原来链表的基础上进行排序,既不能申请新的结点;(2)只能修改结点的next域,不能修改数据域"""class LNode: def __init__(self): self.data原创 2019-01-16 15:57:31 · 2302 阅读 · 0 评论 -
如何在只给定单链表中某个结点的指针的情况下删除该结点
"""假设给定链表1->2->3->4->5->6->7中值向第5个元素的指针,要求把结点5删掉,删除后链表变为1->2->3->4->6->7."""class LNode: def __init__(self): self.data = None原创 2019-01-17 11:56:10 · 554 阅读 · 0 评论 -
如何判断连个单链表(无环)是否交叉
class LNode: def __init__(self): self.data = None self.next = Nonedef IsIntersect(head1, head2): """ 方法功能:判断两个链表是否相交,如果相交找出交点 :param head1: 第一个链表 :param head2: 第...原创 2019-01-17 12:25:04 · 333 阅读 · 0 评论 -
如何实现栈
"""实现一个栈的数据结构,使其具有以下方法:压栈,弹栈,取栈顶元素,判断栈是否为空,以及获取栈中元素的个数。"""# 方法一:数组实现class MyStack1: # 模拟栈 def __init__(self): self.items = [] # 判断栈是否为空 def isEmpty(self): return...原创 2019-01-17 15:19:02 · 343 阅读 · 0 评论 -
如何实现队列
"""实现一个队列的数据结构,使其具有入队列,出队列,查看队列首尾元素,查看队列大小等功能。"""# 方法一:数组实现class MyQueue1: def __init__(self): self.arr = [] self.front = 0 self.rear = 0 # 判断队列是否为空 def isEm...原创 2019-01-17 16:34:47 · 667 阅读 · 0 评论 -
如何翻转栈的所有元素
"""翻转栈的所有元素,例如输入栈{1,2,3,4,5},其中,1处在栈顶,翻转之后的栈为{5,4,3,2,1},其中,5处在栈顶。"""class Stack: def __init__(self): self.items = [] def empty(self): return len(self.items) == 0 de...原创 2019-01-21 11:26:17 · 1078 阅读 · 0 评论 -
如何用O(1)的时间复杂度求栈中最小元素
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): ...原创 2019-01-21 11:38:59 · 311 阅读 · 1 评论 -
如何用两个栈模拟队列操作
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): ...原创 2019-01-21 11:57:35 · 379 阅读 · 0 评论 -
如何设计一个排序系统
"""请设计一个排序系统,能够让每个进入队伍的用户都能看到自己在列队中所处的位置和变化,队伍可能随时有人加入和退出,当有人退出影响到用户的位置排名时需要及时反馈到用户。"""from collections import dequeclass User: def __init__(self, id, name): self.id = id原创 2019-01-21 14:32:44 · 2334 阅读 · 0 评论 -
链表的构造
# 构建链表结构class LNode: def __init__(self): self.data = None # 数据域 self.next = None # 指针域if __name__ == '__main__': # 构造7个元素的列表 i = 1 # 链表头结点 head = LNode() c...原创 2019-01-16 12:52:14 · 959 阅读 · 0 评论 -
给定一个带头结点的单链表,请将其逆序。即如果单链表原来是head->1->2->3->4->5->6->7,那么逆序后变成head->7->6->5->4->3->2->1。
class LNode: def __init__(self): self.data = None # 数据域 self.next = None # 指针域# 方法功能: 对单链表进行逆序 输入参数: head: 链表头结点# 方法1: 就地逆序def Reverse1(head): # 判断链表是否为空 if head == N...原创 2019-01-16 13:41:10 · 1945 阅读 · 0 评论 -
给定一个没有排序的链表,去掉其重复项, 并保留原顺序,例如链表1->3->1->5->5->7,去掉重复项后变成1->3->5->7
class LNode: def __init__(self): self.data = None # 数据域 self.next = None # 指针域"""*** 方法功能:对带头结点的无序单链表删除重复的结点*** 输入参数:head:链表头结点"""def removeDup(head): if head == None ...原创 2019-01-16 14:19:29 · 623 阅读 · 0 评论 -
如何计算连个单链表所代表的数之和
"""给定两个单链表,链表的每个结点代表一位数,计算两个数的和。例如:输入链表(3->1->5)和链表(5->9->2),输出:8->0->8,即513+295=808,注意个位数在链表头"""class LNode: def __init__(self): self.data = None self.next ..原创 2019-01-16 15:07:32 · 525 阅读 · 0 评论 -
如何对数组进行旋转
"""用于将一个n*n的二维数组逆时针旋转45度后打印"""def rotateArr(arr): lens = len(arr) "打印二维数组右上部分" i = lens - 1 while i &gt; 0: row = 0 col = i原创 2019-02-20 15:09:39 · 483 阅读 · 0 评论