freeCodeCamp/guide/english/certifications/coding-interview-prep/algorithms/find-the-symmetric-difference/index.md

10 KiB

title
Find the Symmetric Difference

:triangular_flag_on_post: Remember to use Read-Search-Ask if you get stuck. Try to pair program:busts_in_silhouette: and write your own code:pencil:

:checkered_flag: Problem Explanation:

Symmetric difference (commonly denoted by Δ) of two sets is the set of elements which are in either of the two sets, but not in both.

For example, sym([1, 2, 3], [5, 2, 1, 4]) should yield [3, 4, 5].

Following above definition, symmetric difference of three sets A, B, and C can be expressed as (A Δ B) Δ C.

:speech_balloon: Hint: 1

The arguments object is Array-like object that only inherits Array.length property. Hence consider converting it to an actual Array.

try to solve the problem now

:speech_balloon: Hint: 2

Deem writing a helper function that returns the symmetric difference of two arrays on each call instead of attempting to difference all sets simultaneously.

try to solve the problem now

:speech_balloon: Hint: 3

Apply helper function against the created arguments array reducing its elements pairwise recursively to form the expected output.

Note In the event of odd number of sets the symmetric difference will include identical elements present in all given sets. For instance;

A = {1, 2, 3}
B = {2, 3, 4}
C = {3, 4, 5}

(A ⋂ B) ⋂ C = {1, 4} &Intersection {3, 4, 5}
A ⋂ B = {1, 3, 5}

try to solve the problem now

Spoiler Alert!

:warning:

Solution Ahead!

:beginner: Basic Code Solution:

    function sym() {
      var args = [];
      for (var i = 0; i < arguments.length; i++) {
        args.push(arguments[i]);
      }

      function symDiff(arrayOne, arrayTwo) {
        var result = [];

        arrayOne.forEach(function(item) {
          if (arrayTwo.indexOf(item) < 0 && result.indexOf(item) < 0) {
            result.push(item);
          }
        });

        arrayTwo.forEach(function(item) {
          if (arrayOne.indexOf(item) < 0 && result.indexOf(item) < 0) {
            result.push(item);
          }
        });

        return result;
      }

      // Apply reduce method to args array, using the symDiff function
      return args.reduce(symDiff);
    }

:rocket: Run Code

Code Explanation:

  • push() is used to break down the arguments object to an array, args.
  • The symDiff function finds the symmetric difference between two sets. It is used as a callback function for the reduce() method called on args.
  • arrayOne.forEach() pushes the elements to result which are present only in arrayOne as well as not already a part of result.
  • arrayTwo.forEach() pushes the elements to result which are present only in arrayTwo as well as not already a part of result.
  • The result, which is the symmetric difference is returned. This solution works for any number of sets.

:sunflower: Intermediate Code Solution:

    function sym() {

      // Convert the argument object into a proper array
      var args = Array.prototype.slice.call(arguments);

      // Return the symmetric difference of 2 arrays
      var getDiff = function(arr1, arr2) {

        // Returns items in arr1 that don't exist in arr2
        function filterFunction(arr1, arr2) {
          return arr1.filter(function(item) {
            return arr2.indexOf(item) === -1;
          });
        }

        // Run filter function on each array against the other
        return filterFunction(arr1, arr2)
          .concat(filterFunction(arr2, arr1));
      };

      // Reduce all arguments getting the difference of them
      var summary = args.reduce(getDiff, []);

      // Run filter function to get the unique values
      var unique = summary.filter(function(elem, index, self) {
        return index === self.indexOf(elem);
        });
      return unique;
    }

    // test here
    sym([1, 2, 3], [5, 2, 1, 4]);

:rocket: Run Code

Code Explanation:

  • The slice() method is used to break down the arguments object to an array, args.
  • The getDiff function finds the symmetric difference between two sets, arr1 and arr2. It is used as a callback function for the reduce() method called on args.
  • The first filterFunction() returns elements in arr1 that don't exist in arr2.
  • The next filterFunction() is run on each array against the other to check the inverse of the first check for uniqueness and concatenate it.
  • summary consists of the reduced arguments.
  • filter() is used on summary to keep only the unique values and unique is returned.

:rotating_light: Advanced Code Solution:

    function sym() {
      let argv = Array.from(arguments).reduce(diffArray);
      return argv.filter((element, index, array) => index === array.indexOf(element));//remove duplicates
    }

    function diffArray(arr1, arr2) {
      return arr1
        .filter(element => !arr2.includes(element))
        .concat(arr2.filter(element => !arr1.includes(element)));
    }

    // test here
    sym([1, 2, 3], [5, 2, 1, 4]);

:rocket: Run Code

Code Explanation:

  • The main function sym() creates an array from arguments and reduces its elements utilising helper function diffArray() to a single array.

  • The function diffArray() returns the symmetric difference of two arrays by picking out unique elements in parameterised arrays; arr1 and arr2.

:clipboard: NOTES FOR CONTRIBUTIONS:

  • :warning: DO NOT add solutions that are similar to any existing solutions. If you think it is similar but better, then try to merge (or replace) the existing similar solution.
  • Add an explanation of your solution.
  • Categorize the solution in one of the following categories — Basic, Intermediate and Advanced. :traffic_light:
  • Please add your username only if you have added any relevant main contents. (:warning: DO NOT remove any existing usernames)

See :point_right: Wiki Challenge Solution Template for reference.