Products excluding each element of the array












1












$begingroup$


Given an array of integers, return a new array such that each element at index i of the new array is the product of all the numbers in the original array except the one at i.



For example, if our input was [1, 2, 3, 4, 5], the expected output would be [120, 60, 40, 30, 24]. If our input was [3, 2, 1], the expected output would be [2, 3, 6].



Is there a better solution for this problem?




Note: Division is not allowed.




public class DailyCodingProblem2 {
public static void main(String args) {
int arr = { 1, 2, 3, 4, 5 };
int ans = solution(arr, arr.length);
System.out.println(Arrays.toString(ans));

arr = new int { 3, 2, 1 };
ans = solution(arr, arr.length);
System.out.println(Arrays.toString(ans));
}

private static int solution(int arr, int n) {
int left = new int[n];
int right = new int[n];
int res = new int[n];
left[0] = 1;
right[n - 1] = 1;

for (int i = 1; i < n; i++) {
left[i] = arr[i - 1] * left[i - 1];
}

for (int i = n - 2; i >= 0; i--) {
right[i] = arr[i + 1] * right[i + 1];
}
for (int i = 0; i < n; i++) {
res[i] = left[i] * right[i];
}
return res;
}
}









share|improve this question











$endgroup$












  • $begingroup$
    Please do not update the code in your question to incorporate feedback from answers, doing so goes against the Question + Answer style of Code Review. This is not a forum where you should keep the most updated version in your question. Please see what you may and may not do after receiving answers.
    $endgroup$
    – Mast
    2 days ago










  • $begingroup$
    "Note: Division is not allowed." Why? Is it because of a restriction for the assignment?
    $endgroup$
    – Solomon Ucko
    2 days ago










  • $begingroup$
    @SolomonUcko Yes it is a restriction for the assignment
    $endgroup$
    – Maclean Pinto
    12 mins ago
















1












$begingroup$


Given an array of integers, return a new array such that each element at index i of the new array is the product of all the numbers in the original array except the one at i.



For example, if our input was [1, 2, 3, 4, 5], the expected output would be [120, 60, 40, 30, 24]. If our input was [3, 2, 1], the expected output would be [2, 3, 6].



Is there a better solution for this problem?




Note: Division is not allowed.




public class DailyCodingProblem2 {
public static void main(String args) {
int arr = { 1, 2, 3, 4, 5 };
int ans = solution(arr, arr.length);
System.out.println(Arrays.toString(ans));

arr = new int { 3, 2, 1 };
ans = solution(arr, arr.length);
System.out.println(Arrays.toString(ans));
}

private static int solution(int arr, int n) {
int left = new int[n];
int right = new int[n];
int res = new int[n];
left[0] = 1;
right[n - 1] = 1;

for (int i = 1; i < n; i++) {
left[i] = arr[i - 1] * left[i - 1];
}

for (int i = n - 2; i >= 0; i--) {
right[i] = arr[i + 1] * right[i + 1];
}
for (int i = 0; i < n; i++) {
res[i] = left[i] * right[i];
}
return res;
}
}









share|improve this question











$endgroup$












  • $begingroup$
    Please do not update the code in your question to incorporate feedback from answers, doing so goes against the Question + Answer style of Code Review. This is not a forum where you should keep the most updated version in your question. Please see what you may and may not do after receiving answers.
    $endgroup$
    – Mast
    2 days ago










  • $begingroup$
    "Note: Division is not allowed." Why? Is it because of a restriction for the assignment?
    $endgroup$
    – Solomon Ucko
    2 days ago










  • $begingroup$
    @SolomonUcko Yes it is a restriction for the assignment
    $endgroup$
    – Maclean Pinto
    12 mins ago














1












1








1





$begingroup$


Given an array of integers, return a new array such that each element at index i of the new array is the product of all the numbers in the original array except the one at i.



For example, if our input was [1, 2, 3, 4, 5], the expected output would be [120, 60, 40, 30, 24]. If our input was [3, 2, 1], the expected output would be [2, 3, 6].



Is there a better solution for this problem?




Note: Division is not allowed.




public class DailyCodingProblem2 {
public static void main(String args) {
int arr = { 1, 2, 3, 4, 5 };
int ans = solution(arr, arr.length);
System.out.println(Arrays.toString(ans));

arr = new int { 3, 2, 1 };
ans = solution(arr, arr.length);
System.out.println(Arrays.toString(ans));
}

private static int solution(int arr, int n) {
int left = new int[n];
int right = new int[n];
int res = new int[n];
left[0] = 1;
right[n - 1] = 1;

for (int i = 1; i < n; i++) {
left[i] = arr[i - 1] * left[i - 1];
}

for (int i = n - 2; i >= 0; i--) {
right[i] = arr[i + 1] * right[i + 1];
}
for (int i = 0; i < n; i++) {
res[i] = left[i] * right[i];
}
return res;
}
}









share|improve this question











$endgroup$




Given an array of integers, return a new array such that each element at index i of the new array is the product of all the numbers in the original array except the one at i.



For example, if our input was [1, 2, 3, 4, 5], the expected output would be [120, 60, 40, 30, 24]. If our input was [3, 2, 1], the expected output would be [2, 3, 6].



Is there a better solution for this problem?




Note: Division is not allowed.




public class DailyCodingProblem2 {
public static void main(String args) {
int arr = { 1, 2, 3, 4, 5 };
int ans = solution(arr, arr.length);
System.out.println(Arrays.toString(ans));

arr = new int { 3, 2, 1 };
ans = solution(arr, arr.length);
System.out.println(Arrays.toString(ans));
}

private static int solution(int arr, int n) {
int left = new int[n];
int right = new int[n];
int res = new int[n];
left[0] = 1;
right[n - 1] = 1;

for (int i = 1; i < n; i++) {
left[i] = arr[i - 1] * left[i - 1];
}

for (int i = n - 2; i >= 0; i--) {
right[i] = arr[i + 1] * right[i + 1];
}
for (int i = 0; i < n; i++) {
res[i] = left[i] * right[i];
}
return res;
}
}






java algorithm array






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 12 mins ago









Solomon Ucko

1,112415




1,112415










asked 2 days ago









Maclean PintoMaclean Pinto

1225




1225












  • $begingroup$
    Please do not update the code in your question to incorporate feedback from answers, doing so goes against the Question + Answer style of Code Review. This is not a forum where you should keep the most updated version in your question. Please see what you may and may not do after receiving answers.
    $endgroup$
    – Mast
    2 days ago










  • $begingroup$
    "Note: Division is not allowed." Why? Is it because of a restriction for the assignment?
    $endgroup$
    – Solomon Ucko
    2 days ago










  • $begingroup$
    @SolomonUcko Yes it is a restriction for the assignment
    $endgroup$
    – Maclean Pinto
    12 mins ago


















  • $begingroup$
    Please do not update the code in your question to incorporate feedback from answers, doing so goes against the Question + Answer style of Code Review. This is not a forum where you should keep the most updated version in your question. Please see what you may and may not do after receiving answers.
    $endgroup$
    – Mast
    2 days ago










  • $begingroup$
    "Note: Division is not allowed." Why? Is it because of a restriction for the assignment?
    $endgroup$
    – Solomon Ucko
    2 days ago










  • $begingroup$
    @SolomonUcko Yes it is a restriction for the assignment
    $endgroup$
    – Maclean Pinto
    12 mins ago
















$begingroup$
Please do not update the code in your question to incorporate feedback from answers, doing so goes against the Question + Answer style of Code Review. This is not a forum where you should keep the most updated version in your question. Please see what you may and may not do after receiving answers.
$endgroup$
– Mast
2 days ago




$begingroup$
Please do not update the code in your question to incorporate feedback from answers, doing so goes against the Question + Answer style of Code Review. This is not a forum where you should keep the most updated version in your question. Please see what you may and may not do after receiving answers.
$endgroup$
– Mast
2 days ago












$begingroup$
"Note: Division is not allowed." Why? Is it because of a restriction for the assignment?
$endgroup$
– Solomon Ucko
2 days ago




$begingroup$
"Note: Division is not allowed." Why? Is it because of a restriction for the assignment?
$endgroup$
– Solomon Ucko
2 days ago












$begingroup$
@SolomonUcko Yes it is a restriction for the assignment
$endgroup$
– Maclean Pinto
12 mins ago




$begingroup$
@SolomonUcko Yes it is a restriction for the assignment
$endgroup$
– Maclean Pinto
12 mins ago










1 Answer
1






active

oldest

votes


















2












$begingroup$

Time complexity-wise, I think not. You're required to 'visit' all numbers, and your solution is O(n), so that can't be improved.



Code clarity could be improved, as it's not very obvious what the intention is. Some comments would help that.
I think shifting indices by 1 might make it clearer (left[i+1] = arr[i] * left[i]), but then maybe not because it'd mess up the last loop.



Have you explored different algorithms? I wonder if straightforward memoization makes a very clear solution for this.






share|improve this answer









$endgroup$













    Your Answer





    StackExchange.ifUsing("editor", function () {
    return StackExchange.using("mathjaxEditing", function () {
    StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
    StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
    });
    });
    }, "mathjax-editing");

    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "196"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f212674%2fproducts-excluding-each-element-of-the-array%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    2












    $begingroup$

    Time complexity-wise, I think not. You're required to 'visit' all numbers, and your solution is O(n), so that can't be improved.



    Code clarity could be improved, as it's not very obvious what the intention is. Some comments would help that.
    I think shifting indices by 1 might make it clearer (left[i+1] = arr[i] * left[i]), but then maybe not because it'd mess up the last loop.



    Have you explored different algorithms? I wonder if straightforward memoization makes a very clear solution for this.






    share|improve this answer









    $endgroup$


















      2












      $begingroup$

      Time complexity-wise, I think not. You're required to 'visit' all numbers, and your solution is O(n), so that can't be improved.



      Code clarity could be improved, as it's not very obvious what the intention is. Some comments would help that.
      I think shifting indices by 1 might make it clearer (left[i+1] = arr[i] * left[i]), but then maybe not because it'd mess up the last loop.



      Have you explored different algorithms? I wonder if straightforward memoization makes a very clear solution for this.






      share|improve this answer









      $endgroup$
















        2












        2








        2





        $begingroup$

        Time complexity-wise, I think not. You're required to 'visit' all numbers, and your solution is O(n), so that can't be improved.



        Code clarity could be improved, as it's not very obvious what the intention is. Some comments would help that.
        I think shifting indices by 1 might make it clearer (left[i+1] = arr[i] * left[i]), but then maybe not because it'd mess up the last loop.



        Have you explored different algorithms? I wonder if straightforward memoization makes a very clear solution for this.






        share|improve this answer









        $endgroup$



        Time complexity-wise, I think not. You're required to 'visit' all numbers, and your solution is O(n), so that can't be improved.



        Code clarity could be improved, as it's not very obvious what the intention is. Some comments would help that.
        I think shifting indices by 1 might make it clearer (left[i+1] = arr[i] * left[i]), but then maybe not because it'd mess up the last loop.



        Have you explored different algorithms? I wonder if straightforward memoization makes a very clear solution for this.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 2 days ago









        domendomen

        1762




        1762






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Code Review Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            Use MathJax to format equations. MathJax reference.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f212674%2fproducts-excluding-each-element-of-the-array%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Сан-Квентин

            8-я гвардейская общевойсковая армия

            Алькесар