Voici ma tentative de résoudre ce problème en Java. Je m'excuse pour le formatage non standard, mais le code comporte de nombreuses répétitions et c'est le mieux que je puisse faire pour le rendre lisible.
import java.util.Arrays;
public class Products {
static int[] products(int... nums) {
final int N = nums.length;
int[] prods = new int[N];
Arrays.fill(prods, 1);
for (int
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 ;
}
return prods;
}
public static void main(String[] args) {
System.out.println(
Arrays.toString(products(1, 2, 3, 4, 5))
); // prints "[120, 60, 40, 30, 24]"
}
}
Les invariants de la boucle sont pi = nums[0] * nums[1] *.. nums[i-1]
y pj = nums[N-1] * nums[N-2] *.. nums[j+1]
. Les i
La partie de gauche est la logique du "préfixe", et la partie de droite est la logique du "préfixe". j
La partie droite est la logique du "suffixe".
Un seul scénario récursif
Jasmeet a donné une solution récursive (magnifique !); je l'ai transformée en ce one-liner Java (hideux !). Il fait modification en place , avec O(N)
un espace temporaire dans la pile.
static int multiply(int[] nums, int p, int n) {
return (n == nums.length) ? 1
: nums[n] * (p = multiply(nums, nums[n] * (nums[n] = p), n + 1))
+ 0*(nums[n] *= p);
}
int[] arr = {1,2,3,4,5};
multiply(arr, 1, 0);
System.out.println(Arrays.toString(arr));
// prints "[120, 60, 40, 30, 24]"
59 votes
Cette question a été posée à plusieurs reprises au cours de la semaine écoulée ; est-ce que vous passez tous des entretiens avec la même entreprise ?)
0 votes
Je suis actuellement en train de naviguer
[interview-questions]
à la recherche d'une étiquette. Avez-vous un lien si vous l'avez trouvé ?0 votes
En voici une qui date d'hier ; il y en a eu plusieurs sous différentes formes, mais je ne pense pas qu'elles aient été qualifiées d'interviews : stackoverflow.com/questions/2669831/
3 votes
@Michael : Cette question autorise la division. La mienne l'interdit explicitement. Je dirais qu'il s'agit de deux questions différentes.
0 votes
Voir aussi stackoverflow.com/questions/56215/
10 votes
Remplacez la division par log(a/b)=log(a)-log(b) et voilà !
3 votes
Imaginez qu'il y ait un ou plusieurs zéros dans le tableau, comment allez-vous gérer ce cas ?
0 votes
J'ai fourni une solution de complexité O(n) en espace et O(n^2) en temps que vous pouvez consulter.
0 votes
Int[] arr = new int[]{2, 3, 4, 5} ; int sum =1 ; for(int i=0;i<arr.length;i++) { sum = sum*arr[i] ; } int finalArray[] = new int[arr.length] ; for(int i=0;i<arr.length;i++) { finalArray[i] = sum/arr[i] ; } IntStream.of(finalArray).forEach(System.out::println) ;
1 votes
(@SarojKumarSahoo : comment est
sum/arr[i]
without using division
?)