我很抱歉删除了原来的问题,这里是: 我们有一个包或一组n个整数,我们需要找到每个(n-1)个子集的乘积。 e.g:
S = {1,0,3,6}
ps [1] = 0 * 3 * 6 = 0;
ps [2] = 1 * 3 * 6 = 18;等。
经过讨论,我们需要处理这三个案例,并在下面说明:
1. S is a set (contains one zero element)
for i=1 to n
if s[i]=0
sp[i] = s[1] * s[2] * ...* s[i-1] * s[i+1] *.....*s[n]
else
sp[i] = 0;
2. S is a bag (contains more than one zero element)
for i=1 to n
sp[i] = 0;
3. S is a set (contains no zero elements)
product = 1
for i=1 to n
product *= s[i];
for i=1 to n
sp[i] = product / s[i];
感谢。
答案 0 :(得分:13)
如果设置非常大,可能很方便:
如果集合包含零(即P = 0,x = 0),则必须将其作为一种特殊情况处理。
修改的。这是Scheme中的解决方案,考虑到和答案。我是一个完全的初学者 - 有人可以帮助我改进以下代码(使其更有效,更可读,更多lisp-ish)? (随意编辑我的答案。)
#!/usr/bin/env guile !#
(use-modules (ice-9 pretty-print))
(define (count-zeros l)
(cond ((null? l) 0)
((= 0 (car l)) (+ 1 (count-zeros (cdr l))))
(else (count-zeros (cdr l)))))
(define (non-zero-product l)
(define (non-zero-product-loop l product)
(cond ((null? l) product)
((= 0 (car l)) (non-zero-product-loop (cdr l) product))
(else (non-zero-product-loop (cdr l) (* (car l) product)))))
(non-zero-product-loop l 1))
(define (n-1-products l)
(let ((nzeros (count-zeros l)))
(cond ((> nzeros 1)
(map (lambda (x) 0) l))
((= 1 nzeros)
(map (lambda (x) (if (= 0 x) (non-zero-product l) 0)) l))
(else
(map (lambda (x) (/ (non-zero-product l) x)) l)))))
(pretty-print (n-1-products '(1 2 3 4 5)))
(pretty-print (n-1-products '(0 1 2 3 4)))
(pretty-print (n-1-products '(0 1 2 3 0)))
答案 1 :(得分:11)
您需要明确考虑这三种情况:
1)没有零:预先计算所有元素的乘积,并从该产品中划分出所需的集合元素。
2)一个零:预计算非零元素的乘积。答案始终为0,除非您删除单个零元素,在这种情况下,它是预先计算的产品。
3)多个零:答案始终为0。
这假设您有一个可以包含产品的数据类型......也就是说,您需要注意您的产品不会超过您用来存储它的类型的最大值。
对于实际实现,始终预先计算非零元素的乘积并跟踪有多少个零。如果“set”是动态的(其值发生变化),则需要更新产品和零计数。当被要求提供特定的子集产品时,请考虑各种情况并采取相应措施。
答案 2 :(得分:2)
Set product = 1;
for item in set:
if item index == argument index
ignore
else
product *= item
如果我理解你的问题,这是一个微不足道的解决方案。它应该易于用任何编程语言实现。
答案 3 :(得分:2)
您可以使用O(N)
额外空格(不计算O(1)
输出数组)在O(N)
中解决此问题,甚至不使用除法。这是Java中的算法。
static int[] products(int... nums) {
final int N = nums.length;
int[] prods = new int[N];
int pi = 1;
for (int i = 0; i < N; i++) {
prods[i] = pi;
pi *= nums[i];
}
int pj = 1;
for (int j = N-1; j >= 0; j--) {
prods[j] *= pj;
pj *= nums[j];
}
return prods;
}
//...
System.out.println(
Arrays.toString(products(1, 2, 3, 4, 5))
); // prints "[120, 60, 40, 30, 24]"
答案 4 :(得分:0)
假设您可以使用Python:
您可以使用combinations
method from the itertools
module懒洋洋地生成相关集合的各种子集。完成后,您可以使用reduce
和operator.mul
生成每个产品。