【发布时间】: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 = 0 和 y = 0 并且似乎 x 和 y 值没有更新然后我在 VSCode 中看到了大纲部分我看到了 x和y 被声明了两次,一次在函数开始时,第二次在 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。所以只想尝试蛮力然后有效的解决方案。感谢您的帮助。