算法——常见面试简单算法题

一.洗牌算法

function getMess(arr) {
   return arr.sort(function() {
       return (Math.random - 0.5);
   });
}
function getMess(arr) {
   var n = arr.length;
   var newArr = [];
   while(n) {
       // 随机获取一个数组下标
       var i = Math.floor(Math.random()*n--);
       // 把该随机下标对应的值push到新数组里面,原数组删除该值
       newArr.push(arr.splice(i, 1)[0]);
   }
   return newArr;
}

二.柯里化实现
在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

function curry(fn, argLen, currArgs) {
    return function() {
        console.log("arguments:", arguments, arguments.length)
        var args = [].slice.call(arguments);
        console.log("args:", args)
        // 首次调用时未提供最后一个参数
        if (currArgs !== undefined) {
            args = args.concat(currArgs);
        }
        // 递归出口
        if (args.length == argLen) {
            return fn.apply(this, args);
        } else {
            return curry(fn, argLen, args);
        }
    }
}
function sumOf(a, b, c, d) {
    return a + b + c + d;
}
// 改造普通函数,返回柯里函数
var sum = curry(sumOf, 4);

三.数组去重

let arr1 = [5, 5, 9, 9, 6, 3, 5, 4, 8, 6, 4, 5];
function unique(arr) {
  return Array.from(new Set(arr));
}
unique(arr1);
let arr1 = [5, 5, 9, 9, 6, 3, 5, 4, 8, 6, 4, 5];
function unique(arr){
    let map = new Map();
    let array = new Array();  // 数组用于返回结果
    for (let i = 0; i < arr.length; i++) {
        if(map.has(arr[i])) { // 判断 map 中是否已有该 key 值
            map.set(arr[i], true);  // 后面的true 代表该 key 值在原始数组中重复了,false反之
        } else {  // 如果 map 中没有该 key 值,添加
            map.set(arr[i], false);  
            array.push(arr[i]);
        }
    } 
    return array;
}
unique(arr1);
let arr1 = [5, 5, 9, 9, 6, 3, 5, 4, 8, 6, 4, 5];
function unique(arr) {
  var arr2 = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr2.indexOf(arr[i]) === -1) {
      arr2.push(arr[i]);     
    }
  }
  return arr2;
}
unique(arr1)

猜你喜欢

转载自blog.csdn.net/qq_37282683/article/details/107714442
今日推荐