您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

十道经典的算法编程题目(python语言实现)

时间:2020-09-30 10:03:10  来源:  作者:

如何找出数据中最小的k个数

方法一:将数据排序,然后从排好序的数组中找到第k小的数

方法二:使用选择排序的方式,排序k次,找到第k小的数

方法三:使用快速排序的思想,从中随机选择一个数mid,然后将其划分为三部分

array[low.mid-1]、array[mid]、array[mid+1,high],也就是这三个部分,如果mid-low=k-1那么我们认为array[mid]就是我们所需要找到的,如果mid-low>k-1,那么我们需要从[low,mid-1]中找到第k小的数。如果mid-low<k-1那么我们需要从array[mid+1,high]中找到最小的第k-(mid-low)-1小的值就可以了。

def findsmallK(array,low,high,k):    i=low    j=high    middata=array[i]    while i<j:
        while i<j and array[j]>=middata:
            j-=1
        if i<j:
            array[i]=array[j]            i+=1
        while i<j and array[i]<=middata:
            i+=1
        if i<j:
            array[j]=array[i]            j-=1
    array[i]=middata#i就是中间值    subArrayIndex=i-low#中间处的坐标    if subArrayIndex==k-1:
        return array[i]
    elif subArrayIndex>k-1:
        return findsmallK(array,low,i-1,k)
    else :
        return findsmallK(array,i+1,high,k-(i-low)-1)
if __name__=="__main__":
    array=[4,0,1,0,2,3]
    k=6
    data=findsmallK(array,0,len(array)-1,k)
    print(data)

如何求数组连续最大和

我们可以维护两个空间,一个空间用于计算每个能够连续的最大和,而另外一个用于存储最大的和

def arrsum(arr):    arrlength=len(arr)
    S=[None]*arrlength#记录连续的计算和    MS=[None]*arrlength#记录最大的和    S[0]=arr[0]
    MS[0]=arr[0]
    i=1
    while i<arrlength:
        S[i]=max(S[i-1]+arr[i],arr[i])
        MS[i]=max(MS[i-1],S[i])
        i+=1
    return MS[arrlength-1]
if __name__=="__main__":
    arr=[1,-2,4,8,-4,7,-1,-5]
    data=sum=arrsum(arr)    print(data)

还可以不维护空间,而是直接计算最大值:

def arrsum(arr):    arrlength=len(arr)
    #S=[None]*arrlength#记录连续的计算和    #MS=[None]*arrlength#记录最大的和    #S[0]=arr[0]
    #MS[0]=arr[0]
    S=arr[0]
    MS=arr[0]
    i=1
    while i<arrlength:
        S=max(S+arr[i],arr[i])
        MS=max(MS,S)
        i+=1
    return MS
if __name__=="__main__":
    arr=[1,2,3,-4]
    data=sum=arrsum(arr)    print(data)

计算最大子组的位置

计算最大子组和最大子组的位置,关键在于只要目前nMax相加的是负数,那么说明前面的已经没有意义了,那么就需要重新统计,如果要是为正,那么加上一切可以加上的,如果加上的比Smax要大,那么说明这个有意义,我们需要更改一些信息(这里永远记录最有用的信息),但是如果加上还没有那个大,那说明加上的没有意义。

class Demo:
    def __init__(self):
        self.begin=0
        self.end=0
    def maxArrayValue(self,arr):
        nMax=-2**31
        SMax=0
        st=0
        i=0
        lengths=len(arr)        while i<lengths:
            if nMax<0:#只要小于0,那么就永远接收最新的
                nMax=arr[i]                st=i            else:
                nMax=nMax+arr[i]            if nMax>SMax:
                self.begin=st
                self.end=i
                SMax=nMax            i+=1
        return SMax
    def getBegin(self):
        return self.begin
    def getEnd(self):
        return self.end
if __name__=="__main__":
    arr=[1,-2,4,8,-4,7,-1,-5]
    d=Demo()    data=d.maxArrayValue(arr)    print(data)    print(d.begin,d.end)

如何求数组中两个元素的最小距离

def minDistance(array,num1,num2):
    if array==None or len(array)<1:
        return None
    lastnumindex1=-1
    lastnumindex2=-1
    i=0
    mindis=2**30
    while i<len(array):
        if array[i]==num1:
            lastnumindex1=i
            if lastnumindex2>0:
                mindis=min(mindis,abs(lastnumindex2-lastnumindex1))
        if array[i]==num2:
            lastnumindex2=i
            if lastnumindex1>0:
                mindis=min(mindis,abs(lastnumindex2-lastnumindex1))
        i+=1
    return mindis
if __name__=="__main__":
    arr = [4, 6, 7, 4, 7, 4, 6, 4, 7, 8, 5, 6, 4, 3, 10, 8]
    num1 = 4
    num2 = 8
    print(minDistance(arr,num1,num2))

求三元组的距离

def MinDistance(a,b,c):
    minDist=2**23
    i=0
    j=0
    k=0
    d=0
    while True:
       d=max(abs(a[i]-b[j]),abs(a[i]-c[k]))
       d=max(d,abs(c[k]-b[j]))
       if d<minDist:
           minDist=d       m1=min(a[i],b[j])
       m2=min(m1,c[k])
       if m2==a[i]:
           #print(a[i])
           i+=1
           if i>len(a)-1:
               print(a[i-1],b[j],c[k])
               break
       elif m2==b[j]:           j+=1
           if j>len(b)-1:
               break
       else:
           k += 1
           if k > len(c) - 1:
               break
    return  minDist
if __name__=="__main__":
    a = [3, 4, 5, 7, 15]
    b = [10, 12, 14, 16, 17]
    c = [20, 21, 23, 24, 30, 37]
    dis=MinDistance(a,b,c)
    print(dis)

如何在不排序的情况下求中位数

def findMid(array,low,high,k):    i=low#获取起始的坐标    j=high#获取终止的坐标    firstdata = array[i]  # 获取中间元素    while i<j:
        while i<j and array[j]>=firstdata:
            j-=1
        if i<j:
            array[i]=array[j]            i+=1
        while i<j and array[i]<=firstdata:
            i+=1
        if i<j:
            array[j]=array[i]            j-=1
    array[i]=firstdata    if i-low==k-1:
        if len(array)%2 == 0:#偶数
            return (array[i]+array[i+1])/2
        else:
            return array[i]
    elif i-low>k-1:
        return findMid(array,low,i-1,k)
    else:
        return findMid(array,i+1,high,k-(i-low)-1)
if __name__=="__main__":
    array=[1,2,3,4,5]
    low=0
    high=len(array)-1
    if len(array)%2==0:
        k=(len(array))//2
    else:
        k=(len(array))//2+1
    #k表示第几小    data=findMid(array,low,high,k)    print(data)

如何获取最好的矩阵链相乘方法

def MatrixChainOrder(array,i,j):
    if i==j:
        return 0
    mins=2**32
    k=i    while k<j:
        min=MatrixChainOrder(array,i,k)+MatrixChainOrder(array,k+1,j)+array[i-1]*array[k]*array[j]
        if min<mins:
            mins=min        k+=1
    return mins
if __name__=="__main__":
    array=[1,5,2,4,6]
    print(MatrixChainOrder(array,1,len(array)-1))#将除了第一个和最后一个的包裹起来

如何对大量重复的数字进行排序

def  sort(array):
    data_count=dict()    i=0
    while i<len(array):
        if str(array[i]) in data_count:
            data_count[str(array[i])]=data_count.get(str(array[i]))+1
        else:
            data_count[str(array[i])]=1
        i+=1
    index=0
    #print(data_count)
    for key in sorted(data_count.keys(),key=lambda d:int(d)):
        i=data_count[key]        while i>0:
            array[index]=key            index+=1
            i-=1
if __name__=="__main__":
    array=[15,12,15,2,2,12,2,3,12,100,3,3]
    sort(array)
    i=0
    while i<len(array):
        print(array[i])
        i+=1

如何在有规律的二维数组中进行高效的数据查找

def findWithBinary(array,data):    if array==None or len(array)<1:
        print("参数不合理")
        return False
    i=0
    rows=len(array)
    columns=len(array[0])
    j=columns-1
    while i<rows and j>=0:
        if array[i][j]==data:
            return True        elif array[i][j]>data:
            j-=1        else:            i+=1    return Falseif __name__=="__main__":
    array=[[1,2,3,4],[11,12,13,14],[21,22,23,24],[31,32,33,34],[41,42,43,44]]    print(findWithBinary(array,17))    print(findWithBinary(array,24))

从三个有序的数组中找出他们的公共元素

def findCommon(array1,array2,array3):
    i=0
    j=0
    k=0
    while i<len(array1) and j<len(array2)and k<len(array3):
        if array1[i]==array2[j]==array3[k]:
            i+=1
            j+=1
            k+=1
            print(array1[i-1])
        elif array1[i]<array2[j]:
            i+=1
        elif array2[j]<array3[k]:
            j+=1
        else:
            k+=1
if __name__=="__main__":
    array1=[2,5,12,20,45,85]
    array2=[16,19,20,85,200]
    array3=[3,4,15,20,39,72,85,190]
    findCommon(array1,array2,array3)

如何求一个字符串所有的排列

def swap(str,index1,index2):
    tmp=str[index1]
    str[index1]=str[index2]
    str[index2]=tmp
#看成是两个子问题,一个子问题的从一个字符缩减角度,另外一个是从替换的角度def Permutation(str,start):
    if str is None and start <0:
        return
    if start==len(str)-1:
        print("".join(str))
    else:
        i = start        while i<len(str):
            swap(str,start,i)
            Permutation(str,start+1)
            swap(str,start,i)
            i+=1
def Permutation_transe(s):    str=list(s)
    Permutation(str,0)
if __name__=="__main__":
    a="abc"
    Permutation_transe(a)    print()

递归问题的核心是将问题转变为子问题,然后还要设置好结束条件



Tags:算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
背景对抗是反作弊永恒的主旋律,面对对抗我们需要做到快速响应、见招拆招、在变化中发现不变的本质。在反作弊场景中,黑产必须通过文本进行信息传递或触达受害者,而文本由于其生...【详细内容】
2022-07-14  Tags: 算法  点击:(4)  评论:(0)  加入收藏
请实现一个函数用来匹配包含&#39;. &#39;和&#39;*&#39;的正则表达式。模式中的字符&#39;.&#39;表示任意一个字符,而&#39;*&#39;表示它前面的字符可以出现任意次(含0次)。在本题...【详细内容】
2022-07-13  Tags: 算法  点击:(6)  评论:(0)  加入收藏
高手:滑动窗口是一种比较常用的数据统计算法。简单来说,就是在一个大的数组上,定义一个固定长度的滑动窗口,然后这个窗口在数组上进行滑动。在窗口滑动的过程中,左边会出一个元素...【详细内容】
2022-07-13  Tags: 算法  点击:(8)  评论:(0)  加入收藏
一、希尔排序介绍希尔排序这个名字,来源于它的发明者希尔,也称作“缩小增量排序”,是插入排序的一种更高效的改进版本。希尔排序是基于插入排序的以下两点性质而提出改进方法的...【详细内容】
2022-07-08  Tags: 算法  点击:(14)  评论:(0)  加入收藏
描述为了保证第三方应用与API服务器之间通信的安全性,防止Secret Key盗用、数据篡改等恶意攻击行为,开放平台API 服务器使用签名机制,应用在调用开放平台API,需要计算出一个签...【详细内容】
2022-07-08  Tags: 算法  点击:(9)  评论:(0)  加入收藏
6. 蒙特卡洛算法6.1 计算&pi;" role="presentation" style="display: inline; font-style: normal; font-weight: normal; text-indent: 0px; text-align: left; text-trans...【详细内容】
2022-07-08  Tags: 算法  点击:(17)  评论:(0)  加入收藏
最近读了本好书-《深度学习推荐系统》,读完不觉全身通畅,于是就有了写这篇文章的想法,把自己的理解和总结分享给大家。 本文将按照从算法到工程的顺序,先介绍一下推荐系统整体...【详细内容】
2022-07-05  Tags: 算法  点击:(22)  评论:(0)  加入收藏
一、基础概念1、Sorted(单调递增or单调递减)2、Bounded(存在上下界)3、Accessible by index(能够通过索引访问,数组适合,but链表不适合)二分查找是一种在每次比较之后将查找空间一...【详细内容】
2022-07-04  Tags: 算法  点击:(14)  评论:(0)  加入收藏
分布式系统的模型为了更容易理解分布式系统,我们先来构建一个模型。 武当派因为人口增长变成 11 个办事处分散在地图各地; 办事处之间的通信只能依靠信鸽; 一只信鸽可能无法完...【详细内容】
2022-07-01  Tags: 算法  点击:(20)  评论:(0)  加入收藏
在本课程中, 您将 详细、逐步地解释经典的精选 LeetCode 问题 ,您将了解解决技术编码面试问题的最佳方法。 这是我在准备面试时希望参加的课程。课程英文名:LeetCode in Java A...【详细内容】
2022-06-30  Tags: 算法  点击:(19)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条