python O中的两个数字和程序(N^2)

2024-07-04 05:03:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我习惯于用C++编写代码,但现在我正在学习Python。我开始了解Python语言,它在每个人中都非常流行。所以我想,让我们试一试

目前我正在准备公司面试问题,并且能够解决大部分的C++问题。除此之外,我还试图用Python编写同样的代码。对于我不熟悉的东西,我会做谷歌搜索或观看教程等

当我为之前用python解决的简单面试问题编写代码时,我遇到了一个问题

代码:给定一个整数数组,返回两个数字的索引,以便它们相加到一个特定目标

您可以假设每个输入都有一个解决方案,并且不能两次使用同一个元素

给定一个整数数组,打印两个数字的索引,使它们相加到一个特定目标

def twoNum(*arr, t):
  cur = 0
  x = 0
  y = 0

  for i in range (len(arr) - 1):

      for j in range (len(arr) - 1):
          if(i == j):
              break
          cur = arr[i] + arr[j]
          if(t == cur):
              x = arr[i]
              y = arr[j]
              break

      if(t == cur):
          break

  print(f"{x} + {y} = {x+y} ")

arr = [3, 5, -4, 8, 11, 1, -1, 6]

target = 10

twoNum(arr, t=target)

问题是:我在函数中定义了x, y,然后使用了x = arr[i]y = arr[j],我正在打印这些值

输出为:为0+0=10(其中目标为10)

我猜这可能是因为我最初在函数中使用了x = 0y = 0,而且似乎xy值没有更新,然后我在VSCode中看到了大纲部分,在那里我看到xy被声明了两次,一次在函数开始时,第二次在for循环中

有人能解释一下这里发生了什么事吗

参考,这里是我在C++

中编写的代码的图像

This image is my code written in cpp,


Tags: 函数代码in目标forlenifrange
3条回答

下面是一种使用列表理解实现暴力方法的方法:

arr = [1,3,5,7,9]
target = 6

i,j = next((i,j) for i,n in enumerate(arr[:-1]) for j,m in enumerate(arr[i+1:],i+1) if n+m==target)

输出:

print(f"arr[{i}] + arr[{j}] = {arr[i]} + {arr[j]} = {target}")

# arr[0] + arr[2] = 1 + 5 = 6

也许使用迭代器更适合Python:

from itertools import tee
iArr = enumerate(arr)
i,j  = next((i,j) for i,n in iArr for j,m in tee(iArr,1)[0] if n+m==target)

当您开始实施O(n)解决方案时,您应该查阅字典:

d   = { target-n:j for j,n in enumerate(arr) }
i,j = next( (i,d[m]) for i,m in enumerate(arr) if m in d and d[m] != i )

基本上,您要做的是用python编写C代码。 相反,我将首先尝试关注如何以“pythonic”的方式编写python代码。但对于您的问题,请使用python中的暴力解决:

In [173]: def two_num(arr, t):
 ...:     for i in arr:
 ...:         for j in arr[i + 1: ]:
 ...:             if i + j == t:
 ...:                 print(f"{i} + {j} = {t}")
 ...:                 return

更改此项:

def twoNum(*arr, t):

为此:

def twoNum(arr, t):

*用于指示将有数量可变的参数,请参见this。它不是指针,如C++中的。p>

相关问题 更多 >

    热门问题