一道前端演算法題

我是死肥宅發表於2018-12-11

題目:

求交集
寫一個函式,join,兩個整數陣列(其中元素不重複), 求其交集

join([1,2,3,5], [2,3,6,8]) // [2,3]
複製程式碼

我的第一次答案

function join(A, B) {
	let result = [];
	A.forEach(a => {
    B.forEach(b => {
      if(a === b) {
        result.push(a);
      }
    });
  });
  return result;
}
複製程式碼

別人的答案

function join(A, B) {
  const s = new Set(A)
  return B.filter(x => s.has(x))
}
複製程式碼

我不停的提交系統一直提示我執行超時,起初我以為系統BUG了,看了別人的答案才覺得,是我太Low了。。。我的複雜度是o(n^2)

javascript中的Set資料結構

  • 類似於陣列,但成員的值都是唯一的,沒有重複的值
  • 向Set加入值的時候不會發生型別轉換(類似於===,區別是在Set中NaN只能有一個,而NaN===NaN是false)
陣列去重可以這樣寫:
const set = new Set([1,2,3,4,5,5]);
console.log([...set]); // [ 1, 2, 3, 4, 5 ]
複製程式碼

Set例項的屬性和方法

  • Set.prototype.constructor:建構函式,預設就是Set函式。
  • Set.prototype.size:返回Set例項的成員總數。
  • add(value):新增某個值,返回 Set 結構本身。
  • delete(value):刪除某個值,返回一個布林值,表示刪除是否成功。
  • has(value):返回一個布林值,表示該值是否為Set的成員。
  • clear():清除所有成員,沒有返回值。

常用的Set遍歷方法

  • keys():返回鍵名的遍歷器
  • values():返回鍵值的遍歷器 // 由於Set鍵名和鍵值是同一個值和keys表現一致
  • entries():返回鍵值對的遍歷器
  • forEach():使用回撥函式遍歷每個成員

陣列常用方法

不會修改原資料的操作

Arrary.from 從類陣列物件或可遍歷的物件中建立一個新的陣列例項;

Arrary.of 根據一組引數建立一個新的陣列例項,支援任意引數數量和型別;

Arrary.concat 合併陣列操作,多個引數陣列重尾部插入;

Arrary.every 是否每個元素都通過every指定的函式測試;

Arrary.map 返回對陣列中每個元素執行提供的函式的結果組成的陣列;

Arrary.keys 返回陣列物件中所有鍵值迭代器;

Arrary.values 返回陣列物件中所有值的迭代器;

Arrary.entries 返回陣列物件中所有鍵值對遍歷器;

Arrary.find 返回陣列物件中第一個滿足測試函式的值,否則返回undefined;

Arrary.findIndex 返回陣列物件中第一個滿足測試函式的索引,否則返回-1;

Arrary.includes 判斷陣列中是否包含當前的值,包含返回true,不包含返回false;

Arrary.indexof 返回陣列中第一個相同的值,不存在則返回-1;

Arrary.join 返回用一個分隔符連線起陣列中所有元素的字串;

Arrary.slice 返回陣列物件開始到結束淺拷貝到一個新陣列,處理函式接受兩個引數:起始值,結束值;

Arrary.reduce 陣列中每個元素執行一個函式,引數依次為:累加器,當前元素,當前元素索引,當前陣列,返回累加結果;

Arrary.some 陣列中是否存在可以通過測試函式的元素,存在返回true,否則返回false;

Arrary.forEach 對陣列中每個元素執行提供的函式;

修改原資料操作

Arrary.pop 刪除陣列物件中最後一個值,並將刪除的值返回;

Arrary.push 在陣列物件中最後一位插入一個值;

Arrary.splice 刪除現有元素,使用自定義元素替換;

Arrary.shift 刪除陣列中第一個引數,返回該引數;

Arrary.unshift 將一個或多個元素新增陣列開頭,返回新陣列長度;

Arrary.reverse 反轉陣列元素;

Arrary.filter 過濾陣列物件中所有滿足測試函式的值;

Arrary.sort 為陣列排序,預設使用Unicode碼點排序,可指定排序函式;

tips

  1. indexof vs include : indexof判斷不出NAN,陣列中有空元素,include會認為undefined,indexof不會;include是es6的語法;
  2. for vs map vs foreach : map返回新的陣列,foreach不會;for的效率最高,但可讀性不高,有可能與外部產生耦合。推薦使用高階方法;

相關文章