Find value that occurs in odd number of elements

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;







up vote
1
down vote

favorite












I am trying to solve the following exercise using Javascript:



A non-empty array A consisting of N integers is given. The array contains an odd number of elements, and each element of the array can be paired with another element that has the same value, except for one element that is left unpaired.



For example, in array A such that:



 A[0] = 9 A[1] = 3 A[2] = 9
A[3] = 3 A[4] = 9 A[5] = 7
A[6] = 9


the elements at indexes 0 and 2 have value 9,
the elements at indexes 1 and 3 have value 3,
the elements at indexes 4 and 6 have value 9,
the element at index 5 has value 7 and is unpaired.



I have written the following code.



function solution(A) 
var pop;

if(!A.length)
return 0;

while(A.length)
pop = A.shift();
let pos = A.indexOf(pop);
if(pos >-1)
A.splice(pos,1);
else
return pop


return pop;



The correctness seems to be fine but it fails the performance test. The order shown is O(N**2).



  • Any explanation why it shows exponential timing (I have not used any
    nested loops)?

  • Any suggestions on what would be the optimized code which will run on O(N) having space complexity O(1)?






share|improve this question



























    up vote
    1
    down vote

    favorite












    I am trying to solve the following exercise using Javascript:



    A non-empty array A consisting of N integers is given. The array contains an odd number of elements, and each element of the array can be paired with another element that has the same value, except for one element that is left unpaired.



    For example, in array A such that:



     A[0] = 9 A[1] = 3 A[2] = 9
    A[3] = 3 A[4] = 9 A[5] = 7
    A[6] = 9


    the elements at indexes 0 and 2 have value 9,
    the elements at indexes 1 and 3 have value 3,
    the elements at indexes 4 and 6 have value 9,
    the element at index 5 has value 7 and is unpaired.



    I have written the following code.



    function solution(A) 
    var pop;

    if(!A.length)
    return 0;

    while(A.length)
    pop = A.shift();
    let pos = A.indexOf(pop);
    if(pos >-1)
    A.splice(pos,1);
    else
    return pop


    return pop;



    The correctness seems to be fine but it fails the performance test. The order shown is O(N**2).



    • Any explanation why it shows exponential timing (I have not used any
      nested loops)?

    • Any suggestions on what would be the optimized code which will run on O(N) having space complexity O(1)?






    share|improve this question























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I am trying to solve the following exercise using Javascript:



      A non-empty array A consisting of N integers is given. The array contains an odd number of elements, and each element of the array can be paired with another element that has the same value, except for one element that is left unpaired.



      For example, in array A such that:



       A[0] = 9 A[1] = 3 A[2] = 9
      A[3] = 3 A[4] = 9 A[5] = 7
      A[6] = 9


      the elements at indexes 0 and 2 have value 9,
      the elements at indexes 1 and 3 have value 3,
      the elements at indexes 4 and 6 have value 9,
      the element at index 5 has value 7 and is unpaired.



      I have written the following code.



      function solution(A) 
      var pop;

      if(!A.length)
      return 0;

      while(A.length)
      pop = A.shift();
      let pos = A.indexOf(pop);
      if(pos >-1)
      A.splice(pos,1);
      else
      return pop


      return pop;



      The correctness seems to be fine but it fails the performance test. The order shown is O(N**2).



      • Any explanation why it shows exponential timing (I have not used any
        nested loops)?

      • Any suggestions on what would be the optimized code which will run on O(N) having space complexity O(1)?






      share|improve this question













      I am trying to solve the following exercise using Javascript:



      A non-empty array A consisting of N integers is given. The array contains an odd number of elements, and each element of the array can be paired with another element that has the same value, except for one element that is left unpaired.



      For example, in array A such that:



       A[0] = 9 A[1] = 3 A[2] = 9
      A[3] = 3 A[4] = 9 A[5] = 7
      A[6] = 9


      the elements at indexes 0 and 2 have value 9,
      the elements at indexes 1 and 3 have value 3,
      the elements at indexes 4 and 6 have value 9,
      the element at index 5 has value 7 and is unpaired.



      I have written the following code.



      function solution(A) 
      var pop;

      if(!A.length)
      return 0;

      while(A.length)
      pop = A.shift();
      let pos = A.indexOf(pop);
      if(pos >-1)
      A.splice(pos,1);
      else
      return pop


      return pop;



      The correctness seems to be fine but it fails the performance test. The order shown is O(N**2).



      • Any explanation why it shows exponential timing (I have not used any
        nested loops)?

      • Any suggestions on what would be the optimized code which will run on O(N) having space complexity O(1)?








      share|improve this question












      share|improve this question




      share|improve this question








      edited Jul 12 at 22:59









      Dannnno

      5,3581649




      5,3581649









      asked Jul 12 at 21:12









      Anirban Bera

      83




      83




















          3 Answers
          3






          active

          oldest

          votes

















          up vote
          1
          down vote



          accepted











          Any explanation why it shows exponential timing (I have not used any nested loops)?




          Inside the while loop you have A.indexOf(pop); which is the second inner loop. It iterates over each item until it finds the match. You can use a Set which uses a hash table to locate items.




          Any suggestions on what would be the optimized code which will run on O(N)?




          Use a Set. For each item first check the set, if its there remove it and the item, else add the item to the set and move to the next item. When done you should have one item remaining in the set, that will be the odd one out.



          function findOdd(arr)
          const found = new Set();
          while (arr.length > 0)
          const val = arr.pop(); // or use shift

          // if val in found remove it from the set
          if (found.has(val)) found.delete(val)
          else found.add(val) // else add it to the set

          return [...found.values()][0];






          share|improve this answer























          • Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
            – Anirban Bera
            Jul 13 at 4:26










          • @AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
            – Blindman67
            Jul 13 at 5:01










          • // if val in found remove it from the set comment is useless.
            – Stexxe
            Jul 13 at 11:37

















          up vote
          0
          down vote













          The solution with an O(N) time complexity with O(1) space is a little bit hacky. The solution is to xor each number together. some important properties of xor are:



          1. xor of two identical numbers is zero.

          2. xor of any number and zero is the number.

          3. xor is commutative.

          4. xor is associative.

          example:



          A = [9, 3, 9, 3, 9, 7, 9]



          the solution to this example is:



           (((((9^3)^9)^3)^9)^7)^9
          = 9^3^9^3^9^7^9 (4)
          = 9^9^9^9^3^3^7 (3)
          = (9^9)^(9^9)^(3^3)^7 (3)
          = 0^0^0^7 (1)
          = 7 (2)





          share|improve this answer






























            up vote
            0
            down vote













            We can find unpaired number by sorting array of integers and searching for one, which has no adjacent with same value.
            My suggested solution:



            const nextIsDifferent = (el, index, arr) => ((index + 1) % 2 === 1 && el !== arr[index + 1]);
            const findUnpaired = (arr) => arr.sort().find(nextIsDifferent);

            console.log(findUnpaired([9, 3, 9, 3, 9, 7, 9]));





            share|improve this answer























            • You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
              – Graipher
              Jul 13 at 12:33










            • This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
              – Anirban Bera
              Jul 13 at 15:58










            • I think it's O(NlogN)
              – Stexxe
              Jul 13 at 20:41










            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',
            convertImagesToLinks: false,
            noModals: false,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            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%2f198388%2ffind-value-that-occurs-in-odd-number-of-elements%23new-answer', 'question_page');

            );

            Post as a guest






























            3 Answers
            3






            active

            oldest

            votes








            3 Answers
            3






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            1
            down vote



            accepted











            Any explanation why it shows exponential timing (I have not used any nested loops)?




            Inside the while loop you have A.indexOf(pop); which is the second inner loop. It iterates over each item until it finds the match. You can use a Set which uses a hash table to locate items.




            Any suggestions on what would be the optimized code which will run on O(N)?




            Use a Set. For each item first check the set, if its there remove it and the item, else add the item to the set and move to the next item. When done you should have one item remaining in the set, that will be the odd one out.



            function findOdd(arr)
            const found = new Set();
            while (arr.length > 0)
            const val = arr.pop(); // or use shift

            // if val in found remove it from the set
            if (found.has(val)) found.delete(val)
            else found.add(val) // else add it to the set

            return [...found.values()][0];






            share|improve this answer























            • Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
              – Anirban Bera
              Jul 13 at 4:26










            • @AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
              – Blindman67
              Jul 13 at 5:01










            • // if val in found remove it from the set comment is useless.
              – Stexxe
              Jul 13 at 11:37














            up vote
            1
            down vote



            accepted











            Any explanation why it shows exponential timing (I have not used any nested loops)?




            Inside the while loop you have A.indexOf(pop); which is the second inner loop. It iterates over each item until it finds the match. You can use a Set which uses a hash table to locate items.




            Any suggestions on what would be the optimized code which will run on O(N)?




            Use a Set. For each item first check the set, if its there remove it and the item, else add the item to the set and move to the next item. When done you should have one item remaining in the set, that will be the odd one out.



            function findOdd(arr)
            const found = new Set();
            while (arr.length > 0)
            const val = arr.pop(); // or use shift

            // if val in found remove it from the set
            if (found.has(val)) found.delete(val)
            else found.add(val) // else add it to the set

            return [...found.values()][0];






            share|improve this answer























            • Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
              – Anirban Bera
              Jul 13 at 4:26










            • @AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
              – Blindman67
              Jul 13 at 5:01










            • // if val in found remove it from the set comment is useless.
              – Stexxe
              Jul 13 at 11:37












            up vote
            1
            down vote



            accepted







            up vote
            1
            down vote



            accepted







            Any explanation why it shows exponential timing (I have not used any nested loops)?




            Inside the while loop you have A.indexOf(pop); which is the second inner loop. It iterates over each item until it finds the match. You can use a Set which uses a hash table to locate items.




            Any suggestions on what would be the optimized code which will run on O(N)?




            Use a Set. For each item first check the set, if its there remove it and the item, else add the item to the set and move to the next item. When done you should have one item remaining in the set, that will be the odd one out.



            function findOdd(arr)
            const found = new Set();
            while (arr.length > 0)
            const val = arr.pop(); // or use shift

            // if val in found remove it from the set
            if (found.has(val)) found.delete(val)
            else found.add(val) // else add it to the set

            return [...found.values()][0];






            share|improve this answer
















            Any explanation why it shows exponential timing (I have not used any nested loops)?




            Inside the while loop you have A.indexOf(pop); which is the second inner loop. It iterates over each item until it finds the match. You can use a Set which uses a hash table to locate items.




            Any suggestions on what would be the optimized code which will run on O(N)?




            Use a Set. For each item first check the set, if its there remove it and the item, else add the item to the set and move to the next item. When done you should have one item remaining in the set, that will be the odd one out.



            function findOdd(arr)
            const found = new Set();
            while (arr.length > 0)
            const val = arr.pop(); // or use shift

            // if val in found remove it from the set
            if (found.has(val)) found.delete(val)
            else found.add(val) // else add it to the set

            return [...found.values()][0];







            share|improve this answer















            share|improve this answer



            share|improve this answer








            edited Jul 13 at 4:03


























            answered Jul 12 at 21:32









            Blindman67

            5,2381320




            5,2381320











            • Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
              – Anirban Bera
              Jul 13 at 4:26










            • @AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
              – Blindman67
              Jul 13 at 5:01










            • // if val in found remove it from the set comment is useless.
              – Stexxe
              Jul 13 at 11:37
















            • Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
              – Anirban Bera
              Jul 13 at 4:26










            • @AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
              – Blindman67
              Jul 13 at 5:01










            • // if val in found remove it from the set comment is useless.
              – Stexxe
              Jul 13 at 11:37















            Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
            – Anirban Bera
            Jul 13 at 4:26




            Elegant solution! Can you confirm the worst case space complexity of this? I think it is O(1) (not counting the storage required for input arguments) - correct me if I'm wrong.
            – Anirban Bera
            Jul 13 at 4:26












            @AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
            – Blindman67
            Jul 13 at 5:01




            @AnirbanBera Sorry O(n) space for hash tables. See wiki en.wikipedia.org/wiki/Hash_table
            – Blindman67
            Jul 13 at 5:01












            // if val in found remove it from the set comment is useless.
            – Stexxe
            Jul 13 at 11:37




            // if val in found remove it from the set comment is useless.
            – Stexxe
            Jul 13 at 11:37












            up vote
            0
            down vote













            The solution with an O(N) time complexity with O(1) space is a little bit hacky. The solution is to xor each number together. some important properties of xor are:



            1. xor of two identical numbers is zero.

            2. xor of any number and zero is the number.

            3. xor is commutative.

            4. xor is associative.

            example:



            A = [9, 3, 9, 3, 9, 7, 9]



            the solution to this example is:



             (((((9^3)^9)^3)^9)^7)^9
            = 9^3^9^3^9^7^9 (4)
            = 9^9^9^9^3^3^7 (3)
            = (9^9)^(9^9)^(3^3)^7 (3)
            = 0^0^0^7 (1)
            = 7 (2)





            share|improve this answer



























              up vote
              0
              down vote













              The solution with an O(N) time complexity with O(1) space is a little bit hacky. The solution is to xor each number together. some important properties of xor are:



              1. xor of two identical numbers is zero.

              2. xor of any number and zero is the number.

              3. xor is commutative.

              4. xor is associative.

              example:



              A = [9, 3, 9, 3, 9, 7, 9]



              the solution to this example is:



               (((((9^3)^9)^3)^9)^7)^9
              = 9^3^9^3^9^7^9 (4)
              = 9^9^9^9^3^3^7 (3)
              = (9^9)^(9^9)^(3^3)^7 (3)
              = 0^0^0^7 (1)
              = 7 (2)





              share|improve this answer

























                up vote
                0
                down vote










                up vote
                0
                down vote









                The solution with an O(N) time complexity with O(1) space is a little bit hacky. The solution is to xor each number together. some important properties of xor are:



                1. xor of two identical numbers is zero.

                2. xor of any number and zero is the number.

                3. xor is commutative.

                4. xor is associative.

                example:



                A = [9, 3, 9, 3, 9, 7, 9]



                the solution to this example is:



                 (((((9^3)^9)^3)^9)^7)^9
                = 9^3^9^3^9^7^9 (4)
                = 9^9^9^9^3^3^7 (3)
                = (9^9)^(9^9)^(3^3)^7 (3)
                = 0^0^0^7 (1)
                = 7 (2)





                share|improve this answer















                The solution with an O(N) time complexity with O(1) space is a little bit hacky. The solution is to xor each number together. some important properties of xor are:



                1. xor of two identical numbers is zero.

                2. xor of any number and zero is the number.

                3. xor is commutative.

                4. xor is associative.

                example:



                A = [9, 3, 9, 3, 9, 7, 9]



                the solution to this example is:



                 (((((9^3)^9)^3)^9)^7)^9
                = 9^3^9^3^9^7^9 (4)
                = 9^9^9^9^3^3^7 (3)
                = (9^9)^(9^9)^(3^3)^7 (3)
                = 0^0^0^7 (1)
                = 7 (2)






                share|improve this answer















                share|improve this answer



                share|improve this answer








                edited Jul 13 at 3:52


























                answered Jul 12 at 21:49









                Peter

                59410




                59410




















                    up vote
                    0
                    down vote













                    We can find unpaired number by sorting array of integers and searching for one, which has no adjacent with same value.
                    My suggested solution:



                    const nextIsDifferent = (el, index, arr) => ((index + 1) % 2 === 1 && el !== arr[index + 1]);
                    const findUnpaired = (arr) => arr.sort().find(nextIsDifferent);

                    console.log(findUnpaired([9, 3, 9, 3, 9, 7, 9]));





                    share|improve this answer























                    • You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
                      – Graipher
                      Jul 13 at 12:33










                    • This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
                      – Anirban Bera
                      Jul 13 at 15:58










                    • I think it's O(NlogN)
                      – Stexxe
                      Jul 13 at 20:41














                    up vote
                    0
                    down vote













                    We can find unpaired number by sorting array of integers and searching for one, which has no adjacent with same value.
                    My suggested solution:



                    const nextIsDifferent = (el, index, arr) => ((index + 1) % 2 === 1 && el !== arr[index + 1]);
                    const findUnpaired = (arr) => arr.sort().find(nextIsDifferent);

                    console.log(findUnpaired([9, 3, 9, 3, 9, 7, 9]));





                    share|improve this answer























                    • You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
                      – Graipher
                      Jul 13 at 12:33










                    • This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
                      – Anirban Bera
                      Jul 13 at 15:58










                    • I think it's O(NlogN)
                      – Stexxe
                      Jul 13 at 20:41












                    up vote
                    0
                    down vote










                    up vote
                    0
                    down vote









                    We can find unpaired number by sorting array of integers and searching for one, which has no adjacent with same value.
                    My suggested solution:



                    const nextIsDifferent = (el, index, arr) => ((index + 1) % 2 === 1 && el !== arr[index + 1]);
                    const findUnpaired = (arr) => arr.sort().find(nextIsDifferent);

                    console.log(findUnpaired([9, 3, 9, 3, 9, 7, 9]));





                    share|improve this answer















                    We can find unpaired number by sorting array of integers and searching for one, which has no adjacent with same value.
                    My suggested solution:



                    const nextIsDifferent = (el, index, arr) => ((index + 1) % 2 === 1 && el !== arr[index + 1]);
                    const findUnpaired = (arr) => arr.sort().find(nextIsDifferent);

                    console.log(findUnpaired([9, 3, 9, 3, 9, 7, 9]));






                    share|improve this answer















                    share|improve this answer



                    share|improve this answer








                    edited Jul 13 at 12:49


























                    answered Jul 13 at 12:08









                    Stexxe

                    3067




                    3067











                    • You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
                      – Graipher
                      Jul 13 at 12:33










                    • This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
                      – Anirban Bera
                      Jul 13 at 15:58










                    • I think it's O(NlogN)
                      – Stexxe
                      Jul 13 at 20:41
















                    • You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
                      – Graipher
                      Jul 13 at 12:33










                    • This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
                      – Anirban Bera
                      Jul 13 at 15:58










                    • I think it's O(NlogN)
                      – Stexxe
                      Jul 13 at 20:41















                    You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
                    – Graipher
                    Jul 13 at 12:33




                    You have supplied an alternative solution, without saying how or why it is better. If you could add some details, this would make a nice answer.
                    – Graipher
                    Jul 13 at 12:33












                    This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
                    – Anirban Bera
                    Jul 13 at 15:58




                    This is also a nice solution. Can you please elaborate on the time complexity of it? will it be O(N) or O(NlogN) <for sorting>?
                    – Anirban Bera
                    Jul 13 at 15:58












                    I think it's O(NlogN)
                    – Stexxe
                    Jul 13 at 20:41




                    I think it's O(NlogN)
                    – Stexxe
                    Jul 13 at 20:41












                     

                    draft saved


                    draft discarded


























                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f198388%2ffind-value-that-occurs-in-odd-number-of-elements%23new-answer', 'question_page');

                    );

                    Post as a guest













































































                    Popular posts from this blog

                    Chat program with C++ and SFML

                    Function to Return a JSON Like Objects Using VBA Collections and Arrays

                    Will my employers contract hold up in court?