前端面试中遇到的算法题

1.手搓简单的promise封装ajax

function get(url) {
  return new Promise((resolve, reject) => {
    var xhr = new XMLHttpRequest();
    xhr.open("get", url, true);
    xhr.send();
    xhr.onreadystatechange = function() {
      if (xhr.status == 200 && xhr.readyState == 4) {
        resolve(xhr.responseText);
      }else{
        reject(new Error(xhr.statusText));
      }
    };
  });
}

2.统计字符串中每个字母或者单词出现次数的问题

​ 注意问题:str是字符串也可以是数组。如果是一个长句子或者文章,请利用js将其处理成一个包含所有单词的数组;

function Statistics(str){//缺陷:有兼容性的问题
    var n=new Map();
    //str=str.toLocaleLowerCase()//如有需要可以将其先全部转化为小写
    for(let i=0;i<str.length;i++){
        let x= n.get(str[i])
         if(x){
              x++;
              n.set(str[i],x)
         }else{
            n.set(str[i],1)
         }
    }
   return n
}


function Statistics(str){ //缺点也是兼容性
    return str.split('').reduce((pre, item) => {
         pre[item] ? pre[item] ++ : pre[item] = 1
         return pre;
      }, {})
   }

3.去重问题

本质上是2种方式:1是利用循环查找相同元素并删除或插入一个新数组,2是利用对象属性不可重复的特性

最简单的es6:

function unrepeat(arr){
 return [...new Set(arr)];
  // return Array.from(new Set(arr))
}

利用对象重复属性会被覆盖的特性

function unrepeat(arr){
let obj={};
    
   for(let i=0;i<arr.length;i++){
      obj[arr[i]]=arr[i];
   }
   
   return [...Object.values(obj)];//推荐使用Object,values(),原因Object.keys()取出来是字符串,而Object.values()存的时候是什么类型,取的时候还是什么类型
    //let newarr=[];
   // for(let val of obj){
   //     newarr.push(val);
   // }
    //return newarr;//道理与上面的差不多
}

incloudes方法

 function unrepeat(arr){
     var array =[];
    for(var i = 0; i < arr.length; i++) {
            if( !array.includes( arr[i]) ) {//includes 检测数组是否有某个值
                    array.push(arr[i]);
              }
    }
    return array
 }

indexof去重

function unrepeat(arr) {
   var array = [];
for (var i = 0; i < arr.length; i++) {
    if (array.indexOf(arr[i]) === -1) {
        array.push(arr[i])
    }
}
    return array;
}

4.排序问题

sort函数

function order(arr){
   return arr.sort((a,b)=>a-b)
}

冒泡排序

function order(arr){
for ( var i=0;i<arr.length-1;i++){
        for (var j=0;j<arr.length-1-i;j++) {
            if (arr[j] > arr[j + 1]) {
                var temp = arr[i];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            } 
        }
    }
    return arr;
}

快速排序

function quickSort(arr){
           
            if(arr.length<=1){return arr;}
            var pivotIndex=Math.floor(arr.length/2);
            var pivot=arr.splice(pivotIndex,1)[0];
            var left=[];
            var right=[];
            //比基准小的放在left,比基准大的放在right
            for(var i=0;i<arr.length;i++){
                if(arr[i]<=pivot){
                    left.push(arr[i]);
                }
                else{
                    right.push(arr[i]);
                }
            }
            //递归
            return quickSort(left).concat([pivot],quickSort(right));
        }  

插入排序

function insertionSort(arr) {
    var len = arr.length;
    var preIndex, current;
    for (var i = 1; i < len; i++) {
        preIndex = i - 1;
        current = arr[i];
        while (preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex + 1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex + 1] = current;
    }
    return arr;
}

5.深拷贝问题

递归

//该代码系转载,已经忘了从哪复制的了
function deepClone(obj){
    let objClone = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                //判断ojb子元素是否为对象,如果是,递归复制
                if(obj[key]&&typeof obj[key] ==="object"){
                    objClone[key] = deepClone(obj[key]);
                }else{
                    //如果不是,简单复制
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}    

JSON对象方式,但是有缺陷:无法拷贝对象里的方法

function deepClone(obj) {
  var _obj = JSON.stringify(obj),
    objClone = JSON.parse(_obj);
  return objClone;
}

jq

var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝

6.数组扁平化问题

递归

//改代码是转载,也是忘了从哪复制的了
function Flat5(arr){
        var newArr =[];
        for(var i= 0; i < arr.length; i++){
            if(arr[i] instanceof Array){
                newArr = newArr.concat(Flat5(arr[i]));
                // newArr.push.apply(newArr, Flat5(arr[i]));
            }else{
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
function newarr(arr) {
  return arr.reduce((a, b) => {
    if (Object.prototype.toString.call(b) == "[object Number]") {
      return a.concat(b);
    } else {
      return a.concat(newarr(b));
    }
  }, []);
}

7.青蛙跳台阶,有多少种方法的问题。

function Frogjump(n){
let dp=[1,1];
for(let i=2;i<n+1;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}

8.某个范围内的随机数

function randomRang2(min, max) {//闭区间
    return Math.floor(Math.random()* (max - min + 1) + min);
}

9.除去字符串中的空格

function strtrim(str){
    return str.trim();//去除左右两端
    //return str.replice(/\s/g,"")//去除全部空格
}

10.将普通数字转人民币形式的数字(例如1234567转成1,234,567)

function rmbnumber(str){
 let arr= typeof str=="number"?str.toString().split("").reverse():str.split("").reverse()
  for(let i=3;i<arr.length;i+=4){
          arr.splice(i,0,",");
  }
  return arr.reverse().join("");
}

这些是我面试中遇到的一些题,如有错误请指正,感谢各位大佬花时间瞅瞅(๑•̀ㅂ•́)و✧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值