Python求解两数之和[通俗易懂]

Python求解两数之和[通俗易懂]题目描述:写一个函数,此函数要实现以下功能:给一个列表,并且给一个目标数字,如果列表里的两个数字之和等于目标数字,返回那两个数字的索引值。比如,给定列表[3,5,7,14],目标数字是10,那么返回[0,2],0是3的索引,2是7的索引,3+7=10.注意,不可以重复利用列表中的某个数字,比如返回[1,1]是不能接受的。一、两层for循环遍历列表思路:先拿出列表里的第0个数…

大家好,又见面了,我是你们的朋友全栈君。

题目描述:

写一个函数,此函数要实现以下功能:

给一个列表,并且给一个目标数字,如果列表里的两个数字之和等于目标数字,返回那两个数字的索引值。

比如,给定列表[3,5,7,14],目标数字是10,那么返回[0,2],0是3的索引,2是7的索引,3+7=10.

注意,不可以重复利用列表中的某个数字,比如返回[1,1]是不能接受的。

一、两层for循环遍历列表

思路:先拿出列表里的第0个数字,依次尝试和第1个、第2个……第n个相加,看能否等于目标数字,如果有某个组合等于目标数字,就返回这个组合的两个索引值,如果都不行,再拿出第1个数字,依次尝试和第2个、第3个……第n个相加,看能否等于目标数字……每个数字都不需要回过头和前面的数字相加,因为之前已经尝试过了。

这种方法的思路非常简单,但是算法的时间复杂读比较高,为O(n2),当给定的列表很长的时候,耗时非常长。

#nums参数需要一个列表,target参数就是我们想实现的和的值
def twoIndices(nums,target):
    '''这是寻找和为目标值的两个数的索引的函数'''
    for i in range(len(nums)):
        #我们不需要回过头相加,所以j是从i的下一个数字开始,到列表的末尾
        for j in range(i+1,len(nums)):
            if nums[i]+nums[j]==target:
                return [i,j]
    else:
        return "No such two numbers."

#这是我们用来检测上述函数是否好用的一个例子
print(twoIndices([3,6,3,5],6))

二、用字典来实现

思路:

先建立一个用于存放数字和索引的空字典。

我们从列表中取出一个数字,然后看字典里是否存在能跟这个数字相加得到目标数字的数字。如果存在,就返回两个数字的索引,不存在,就把取出来的这个数字作为键,它的索引作为值存进字典,并取出下一个数字,重复刚才的操作,直到找到合适的两个数字或者全部数字都看过一遍为止。

这样算法的时间复杂度是O(n),比第一种方法好多了。

#nums参数需要一个列表,target参数就是我们想实现的和的值
def twoIndices(nums,target):
    '''这是寻找和为目标值的两个数的索引的函数'''
    #定义一个用于存放数字和索引的字典
    mydict={}
    #遍历列表里的数字,得到索引和数字
    for index,right_num in enumerate(nums):
        #用目标数字减去我们当前从列表中取出的数字,得到我们需要的数字
        left_num=target-right_num
        #如果字典里已经存放了我们需要的数字
        if mydict.get(left_num) != None:
            #返回我们需要的数字的索引和当前数字的索引,终止循环
            return [mydict[left_num],index]
        #如果字典里还不存在我们需要的数字,则把当前的数字和它的索引存入字典
        mydict[right_num]=index 
    else:
        return 'No such two numbers.'

#用这个列表测试我们的函数好不好用
print(twoIndices([3,5,3,8],6))

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137833.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • (二)Python的应用领域

    (二)Python的应用领域Python的应用领域主要有如下几个:Web应用开发Python 经常被用于Web开发,尽管目前PHP、JS依然是Web开发的主流语言,但Python上升势头更劲。尤其

    2022年7月5日
    23
  • mysql gtid复制_MySQL主从同步

    mysql gtid复制_MySQL主从同步48、mysql基于GTID的主从复制实战

    2022年4月20日
    37
  • 26款 流媒体服务器开源软件「建议收藏」

    26款 流媒体服务器开源软件「建议收藏」26款流媒体服务器开源软件1Flash流媒体服务器Red52DarwinStreamingServer3流媒体服务器OpenStreamingServer4MPEG4IP5开源流媒体平台FreeCast6

    2022年5月6日
    44
  • Mysql decimal详解

    Mysql decimal详解Mysqldecimal如何定义特点特点一详解如何定义decimal(totalCount,afterCount)参数说明totalCount:数字数量总和afterCount:小数点后数字数量总和特点每4字节存储9位数字,不足9位试具体位数决定占用空间最多存储65位数字,其中小数点前最多占35个,小数点后最多占30小数点占一字节最大空间占用为31字节特点一详解12(9+3)位数字,占6(4+2)位,3位数字最大值为999,1字节(28,256)<999

    2022年7月17日
    21
  • Air系列模块常见问题列表[通俗易懂]

    Air系列模块常见问题列表[通俗易懂]目录名称一、Luatools使用问题1.1烧录下载 1.1.1、2G模块无法烧录下载 1.1.2、2G开发板无法烧录下载 1.1.3、4G模块(开发板)无法烧录下载 1.1.4、生成量产文件时的加密功能有什么用 1.1.5、4G开发模式下的“USB打印Trace、UART1打印Trace、UART2打印Trace”是什么功能 1.1.6、Luat开发方式下可以烧录哪种类型的文件 1.1.7、脚本代码中如何读取通过Luatools烧录进模块的文件 1.1.8、Luat开发方式下可以烧录某

    2022年5月12日
    42
  • js中的表单序列化不会序列化未选中的单选框

    js中的表单序列化不会序列化未选中的单选框

    2021年5月25日
    109

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号