vieux mais très cool, on m'a demandé cela à une entrevue et moi-même vu plusieurs solutions depuis mais c'est mon préféré comme pris de http://www.polygenelubricants.com/2010/04/on-all-other-products-no-division.html
static int[] products(int... nums) {
final int N = nums.length;
int[] prods = new int[N];
java.util.Arrays.fill(prods, 1);
for (int // pi----> * <----pj
i = 0, pi = 1 , j = N-1, pj = 1 ;
(i < N) & (j >= 0) ;
pi *= nums[i++] , pj *= nums[j--] )
{
prods[i] *= pi ; prods[j] *= pj ;
System.out.println("pi up to this point is " + pi + "\n");
System.out.println("pj up to this point is " + pj + "\n");
System.out.println("prods[i]:" + prods[i] + "pros[j]:" + prods[j] + "\n");
}
return prods;
}
Voici ce qui se passe, si vous écrivez aiguillons [i] pour toutes les itérations, vous verrez ce qui suit étant calculé
prods[0], prods[n-1]
prods[1], prods[n-2]
prods[2], prods[n-3]
prods[3], prods[n-4]
.
.
.
prods[n-3], prods[2]
prods[n-2], prods[1]
prods[n-1], prods[0]
de sorte que chaque aiguillons [i] get frapper deux fois, un de l'aller de la tête à la queue et une fois de la queue à la tête, et ces deux itérations accumulent le produit comme ils traversent vers le centre de sorte qu'il est facile de voir que nous aurons exactement ce dont nous avons besoin, nous venons besoin d'être prudent et de voir qu'il manque l'élément lui-même et c'est là que ça devient compliqué. la clé réside dans la
pi *= nums[i++], pj *= nums[j--]
dans la boucle elle-même conditionnelle et non pas dans le corps qui ne se produit pas jusqu'à la fin de la itération. Donc, pour prods[0],
il commence à 1 * 1, puis pi se prépare à 120 après, de sorte que aiguillons [0] manque le premiers éléments prods[1],
est de 1 * 120 = 120, puis pi se prépare à 120 * 60 après etc. et ainsi de suite
pouvez-vous reformuler la question?Je ne sais pas pourquoi la division est nécessaire ... est-ce pour trouver le produit cumulatif? –
Cette question est habituellement posée en O (n) sans division. –
Notez que l'utilisation de la division ne fonctionne pas si la liste contient un zéro. –