2014-11-08 4 views
1

массив целочисленных a[] = {3, 5, 7} элементов // массива являются уникальными
печати все комбинированный продукт:печати все сочетание продуктов массива

input : 3, 5, 7
output: 3, 5, 7, 15, 21, 35, 105

Недавно меня задали этот вопрос в интервью. Я не мог придумать подход. пожалуйста, предложите подход/код.

+0

Было ли какое-либо требование, чтобы проверить наличие дубликатов в результатах? Как 2, 3, 6, 7 будут иметь дубликаты, так как 2 * 3 * 7 = 6 * 7 –

+0

В общем, у вас есть 2^n продуктов здесь (каждый элемент может присутствовать или нет), но проверка дубликатов - это еще одна вещь –

+0

use recursion ... –

ответ

2

Вы можете сделать это с помощью простой рекурсивной функции:

def all_products(S,A,base=1): 
    """Add all products of base times elements from the array A to set S""" 
    S.add(base) 
    if A: 
     all_products(S,A[1:],base) 
     all_products(S,A[1:],base*A[0]) 

S=set() 
all_products(S, [3, 5, 7]) 
print sorted(S) 

Этот подход также включает в себя результат (1) не умножая ни один из элементов вместе.

+0

Мне нравится, как S.add заботится о уникальности продукта. Хорошая вещь для Python. –

1

Вот код Java для создания набора, который вы хотите:

import java.util.*; 

public class MainClass { 

    public static void main(String[] args) throws java.lang.Exception { 
     MainClass mainClass = new MainClass(); 
     Set<Integer> ints = new HashSet<Integer>(); 

     ints.add(3); 
     ints.add(5); 
     ints.add(7); 

     ints = mainClass.recursiveSetCreator(ints); 

     printOutput(ints); 
    } 

    private static void printOutput(Set<Integer> ints) { 
     List list = new ArrayList(ints); 
     Collections.sort(list); 
     System.out.println(list); 
    } 

    public Set<Integer> recursiveSetCreator(Set<Integer> recInput) { 
     if (recInput.size() == 1) { 
      return recInput; 
     } 
     List integerList = new ArrayList(recInput); 
     Integer lastItem = (Integer) integerList.remove(integerList.size() - 1); 
     recInput.remove(lastItem); 
     recInput = recursiveSetCreator(recInput); 
     int size = recInput.size(); 
     integerList = new ArrayList(recInput); 
     for (int i = 0; i < size; i++) { 
      Integer item = (Integer) integerList.get(i); 
      recInput.add(item * lastItem); 
     } 
     recInput.add(lastItem); 
     return recInput; 
    } 
} 

Вы можете увидеть бегущую версию на Ideone

Смежные вопросы