【问题标题】:Two number Sum program in python O(N^2)python中的两个数字Sum程序O(N ^ 2)
【发布时间】:2020-04-02 10:45:51
【问题描述】:

我习惯用 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],我正在打印这些值。

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

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

谁能给我解释一下这里发生了什么?

作为参考,这是我用 C++ 编写的代码的图像

【问题讨论】:

  • 为什么要在第一个参数上加星号?即使在您的 C++ 中,参数名称也只是“arr”——* 是其类型的一部分。 (详情请阅读文档。)
  • def twoNum(*arr,t): 更改为def twoNum(arr,t):,您的程序应该可以运行了。
  • 这是一个众所周知的问题,可以在 O(n) 而不是 O(n^2) 中解决,如 described here 使用散列。
  • 看到上面的代码可以写成:def twoNum(arr, t): return print(next(f"{i} + {j} = {t} " for i, j in zip(arr, arr) if i + j == t )),你会喜欢 Python。你不会通过首先考虑我将如何用 C++ 编写这个来得到这个。但是开始学习是可以的,但提交这样的代码进行面试并不好。
  • 我知道它可以在线性时间内解决,但我只是为了好玩而学习 python。所以只想尝试蛮力然后有效的解决方案。感谢您的帮助。

标签: python arrays algorithm


【解决方案1】:

改变这个:

def twoNum(*arr, t):

到这里:

def twoNum(arr, t):

* 用于表示将有可变数量的参数,请参阅this。它不适用于 C++ 中的指针。

【讨论】:

    【解决方案2】:

    基本上你想做的是用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
    

    【讨论】:

    • 如果你想要 i 和 j 的索引,你可以返回 arr.index(i), arr.index(j)
    • 如果您想以更有效的方式解决它,您可以对 arr 进行排序,然后在 sum t 时递减高
    • 我知道它可以在线性时间和 O(NlogN) 中使用排序来解决,但我只是为了好玩而学习 python。所以只是想尝试蛮力然后任何其他有效的解决方案。
    【解决方案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
    

    也许更 Pythonic 的是使用迭代器:

    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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2014-06-13
      • 1970-01-01
      • 2012-06-21
      相关资源
      最近更新 更多