给定一个整数数组 nums 和一个整数目标值 target,请在该数组中找 和为目标值 target 的三个整数,并返回它们的数组下标【杭州多测师】【杭州多测师_王sir】

给定一个整数数组 nums 和一个整数目标值 target,请在该数组中找 和为目标值 target 的三个整数,并返回它们的数组下标

# 第一种:通过for循环遍历实现
class Foo(object):

    @staticmethod
    def sum(nums, target):
        result = []
        n = len(nums)
        for i in range(n):
            for j in range(i+1,n):
                for k in range(j+1,n):
                    num = nums[i] + nums[j] +nums[k]
                    if num == target:
                        result.append(i)
                        result.append(j)
                        result.append(k)
                        break
        return result

n = [5,1,2,4]
print(Foo.sum(n,7))

 

# 第二种:列表推导式
# nums = [1,2,3,4,5,6,7,8,9]
def fun(nums,target):
    list1 = [(x,y,z) for x,x1 in enumerate(nums)
             for y,y1 in enumerate(nums)
             for z,z1 in enumerate(nums)
             if x1!=y1!=z1 and x1+y1+z1==9]
    print(list1)

nums = [5,1,2,4,7]
target=9
fun(nums,target)

 

#第三种方法
def func1(nums,target):
    i = 0
    while i < len(nums)-2:
        j = i+1
        k = len(nums)-1
        while j < k:
            if nums[i]+nums[j]+nums[k] > target:
                k -= 1
            elif nums[i] + nums[j] + nums[k] < target:
                j += 1
            else:
                return [i,j,k]
        i += 1

nums = [1,2,2,3,5]
a = func1(nums,7)

 

 

#定义函数threeSum接收参数为列表及目标值
def threeSum(alist, targetnum):
#假设这三个数分别为a,b,c和为targetnum,此处设置第一重循环,获取循环获取a的下标和值
    for i, j in enumerate(alist):
#此处设置第二重循环用于获取b的下标和值
        for m, n in enumerate(alist[i+1:]):
#由于b的下标和值使用了切片操作每次取i+1后值,每次获取的下标m不是在原列表中的实际为,所以需要通过计算realM得到b在原列表的实际位置
            realM = i+m+1
#根据i和m的值计算c在原列表中取值的起始位置,由于c需要在b后面一位开始取值,所以需要+2
            k = i+m+2
#通过统计c出现次数,判断targetnum - (j+n)是否出现在列表索引k位置之后
            if alist[k:].count(targetnum - (j+n)) > 0:
#c值在列表索引k位置之后可能出现多次,此处用循环取得所有c值
                for x in range(alist[k:].count(targetnum - (j+n))):
#使用index函数获取c值对应的下标索引
                    y = alist.index(targetnum - (j+n), k)
#打印一组a,b,c值对应的索引下标
                    print(i, realM, y)
#重置c值的搜索起始位置为y+1
                    k = y+1
 
#定义输入列表数据
a = [5,1,2,4,7,4,3,1]
#调用函数传入列表a及目标值7 
threeSum(a, 7)

 

posted @ 2022-10-13 12:27  多测师_王sir  阅读(135)  评论(0编辑  收藏  举报