回顾算法题

169 阅读1分钟

数组去重

const arr = [1, 1, 2, 3, 4, 5, 6];

// 方法一: Set
const unique = (arr) => {
  return [...new Set(arr)]; // 或者Array.from(new Set(arr))
};

// 方法二:用filter 空间复杂度O(1)
const unique = (arr) => {
  return arr.filter((item, index) => arr.indexOf(item) == index);
};

// 方法三:对于有序数组,相邻两项对比法, 空间复杂度O(1)
// splice 改变了原数组,遍历的时候数组长度会改变,所以当删除一个元素后要记得i--
const unique = (arr) => {
  if (arr.length < 2) return arr;
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] == arr[i + 1]) {
      arr.splice(i, 1);
      i--;
    }
  }
  return arr;
};

// 其他方法,定义一个新数组用来存放去重后元素,空间复杂度O(n);
const unique = (arr) => {
  let newArr = [];
  for (let i = 0; i < arr.length; i++) {
    if (!newArr.includes(arr[i])) {
      // 或者newArr.indexOf(arr[i]) == -1
      newArr.push(arr[i]);
    }
  }
  return newArr;
};

unique(arr);

两个有序数组如何合并成一个有序数组

function arrSort(arr1, arr2) {
    var [i,j] = [0,0];
    let newArr = [];
    while(i < arr1.length || j <arr2.length) {
        if (arr1[i] < arr2[j]) {
            newArr.push(arr1[i]);
            i++
        } else if (arr1[i] > arr2[j]) {
            newArr.push(arr2[j])
            j++
        } else {
            if(arr1[i]) newArr.push(arr1[i]);
            if(arr2[j]) newArr.push(arr2[j]);
            i++;
            j++
        }
    }
    return newArr
}

let arrs = arrSort([2,4,6,7], [1,2,3,5,8,9,10,33,44,49]);

console.log(arrs); 

给定两个数组,编写一个函数来计算它们的交集

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]

function(nums1, nums2) {
    return [...new Set(nums1.filter((item)=>nums2.includes(item)))]
};

function(nums1, nums2) {
    let map1 = new Set(nums1);
    let map2 = new Set(nums2);
    let res = []
    map1.forEach((item) => {
        if(map2.has(item)){
             res.push(item)
        }
       
    })
    return res
};

function(nums1, nums2) {
    const map = {}, ans = [];
    nums1.forEach(element => {
        map[element] = true;
    });
    nums2.forEach(element => {
        if (map[element]) {
            ans.push(element);
        }
    });
    return ans;
}

手写一个方法,一个很深的对象,逐次取出每一层级的key转化为arr

求最长公共前缀

输入: ["flower","flow","flight"]  输出: "fl"

juejin.im/post/684490…

对象数组按对象的某个属性给数组排序

const compare = property => {
    return (a,b) => {
        const value1 = a[property];
        const value2 = b[property];
        return value1 - value2; // 升序
    };
};
arr.sort(compare('age'))