[Advanced Algorithm] - Symmetric Difference

題目

建立一個函數,接受兩個或多個數組,返回所給數組的 對等差分(symmetric difference) ( or )數組.數組

給出兩個集合 (如集合 A = {1, 2, 3}和集合 B = {2, 3, 4}), 而數學術語 "對等差分" 的集合就是指由全部只在兩個集合其中之一的元素組成的集合(A △ B = C = {1, 4}). 對於傳入的額外集合 (如 D = {2, 3}), 你應該安裝前面原則求前兩個集合的結果與新集合的對等差分集合 (C △ D = {1, 4} △ {2, 3} = {1, 2, 3, 4}).函數

提示

Array.reduce()
Symmetric Difference測試

測試用例

  • sym([1, 2, 3], [5, 2, 1, 4]) 應該返回 [3, 4, 5].
  • sym([1, 2, 3], [5, 2, 1, 4]) 應該只包含三個元素.
  • sym([1, 2, 5], [2, 3, 5], [3, 4, 5]) 應該返回 [1, 4, 5]
  • sym([1, 2, 5], [2, 3, 5], [3, 4, 5])應該只包含三個元素.
  • sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])應該返回 [1, 4, 5].
  • sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]) 應該只包含三個元素.
  • sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3]) 應該返回 [2, 3, 4, 6, 7].
  • sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3]) 應該只包含五個元素.
  • sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])應該返回 [1, 2, 4, 5, 6, 7, 8, 9].
  • sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1]) 應該只包含八個元素.

分析思路

  1. 因爲傳入參數是可變的,因此會用到 arguments,又因爲arguments只有 length 屬性,因此要把 arguments 轉換成普通數組,代碼以下:
    var argArray = Array.from(arguments);
  2. 根據題目,分析 A,B 中互相存在的元素,都須要過濾掉,用下面的代碼過濾:
function diff(A, B) {
    return A.filter(function(val) {
      return !B.includes(val);
    });
  }

這個函數是去掉 A 中全部 B 擁有的元素,交換 A,B 位置,去掉B 中全部 A擁有的元素,這樣既可取出題目所需:
diff(A, B).concat(diff(B, A))code

  1. 使用 reduce 方法實現多個數組遍歷;
  2. 從測試用例中發現不能出現重複的數組值返回,因此須要去重,去重函數:
function delSame(arr) {
    return arr.filter(function(val, curindex) {
      return curindex == arr.indexOf(val);
    });
  }

代碼

function sym() {
  // difference between set A and set B
  function diff(A, B) {
    return A.filter(function(val) {
      return !B.includes(val);
    });
  }

  function delSame(arr) {
    return arr.filter(function(val, curindex) {
      return curindex == arr.indexOf(val);
    });
  }

  var argArray = Array.from(arguments);
  return delSame(argArray.reduce(function(arr, cur) {
    return diff(arr, cur).concat(diff(cur, arr)).sort();
  }));
}
// test here
sym([1, 2, 3], [5, 2, 1, 4]);
相關文章
相關標籤/搜索