gpt4 book ai didi

java - 3-Sum Java 到 Python 的转换

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:04 25 4
gpt4 key购买 nike

我正在尝试将此 Java(我认为)代码转换为 Python。

来自:

    public class ThreeSum
{
public static int count(int[] a)
{
int N = a.length;
int count = 0;
for (int i = 0; i < N; i++)
for (int j = i+1; k < N; j++)
for (int k = j+1; k<N; k++)
if (a[i] + a[j] + a[k] == 0)
count++;
return count;
}
public static void main(String[] args)
{
int[] a = In.readInts(args[0]);
StdOut.printIn(count(a));
}
}

收件人:

a = [30,-40,-20,-10,40,0,10,5]
def check(list):
N = len(list)
count = 0
i = 0
while i < N:
i += 1
j = i+1
while j < N:
j += 1
k = j+1
while k < N:
k += 1
if a[i]+a[j]+a[k] == 0: #<-- this is the main part with error "list index out of range"
count += 1
return count
print count
check(a)

它应该检查列表中的所有数字有多少 3 对的总和等于 0。我不确定用什么代替“for(int i = 0; i < N; i++)”。我认为我的 while 循环做同样的事情,还是我错了?

最佳答案

Python 的for 语句只能遍历可迭代对象。所以,如果你想遍历一个数字范围,你可以使用一个 range 对象作为一个可迭代对象。所以,这个 Java:

for (int k = j+1; k<N; k++)

... 变成这个 Python:

for k in range(j+1, N):

在很多情况下,您实际上并不想这样做,这毫无值(value);如果您唯一要使用 k 的是 a[k],您可以迭代 a 本身。但是,在这种特殊情况下,您需要 ij 来设置 jk 的限制。 (您仍然可以使用 enumerate 编写循环,但我认为这只会妨碍这里。)

所以,整个事情可以是:

N = len(a)
count = 0
for i in range(N):
for j in range(i+1, N):
for k in range(j+1, N):
if a[i]+a[j]+a[k] == 0:
count += 1
return count

但是,我认为如果将它变成生成器转换管道会更干净:

N = len(a)
sums = (a[i]+a[j]+a[k]
for i in range(N) for j in range(i+1, N) for k in range(j+1, N))
zeros = (n for n in sums if n == 0)
return sum(1 for _ in zeros)

或者,如果您想对它进行编码,请利用 TrueFalse 分别为 1 这一事实0 用作整数时:

N = len(a)
return sum(not a[i]+a[j]+a[k]
for i in range(N) for j in range(i+1, N) for k in range(j+1, N))

但是一旦你用这些术语思考,是否有办法生成所有这些 a[i]a[j] a[k] 一步到位?是的,这些只是 a 中 3 个元素的所有可能组合。感谢@alfasin 在我面前解决了这个问题,并且比我以前写得更简洁。 :) 所以:

combs = itertools.combinations(a)
sums = map(sum, combs)
zerosums = (n for n in sums if n == 0)
return sum(1 for _ in zerosums)

或者,再次打代码:

return sum(not sum(c) for c in itertools.combinations(a))

关于java - 3-Sum Java 到 Python 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25945590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com