拼多多2019前端笔试题解
总共八道简答题。由于不能用IDE,只能靠记忆了
第一题:判断输出结果。
答案:[1,2,3,1,1,2]
第二题:字符串全排列
剑指offer原题,可以用递归交换的思路,也可以用回溯法
回溯法:
function Permutation(str) { let res=[],pStr=""; if(str.length<=0) return res; arr=str.split("");//将字符串转化为字符数组 res=permutate(arr,pStr,res); return res; } function permutate(arr,pStr,res){ if(arr.length==0){ return res.push(pStr); }else{ let isRepeated=new Set(); for(let i=0;i<arr.length;i++){ if(!isRepeated.has(arr[i])){//避免相同的字符交换 let char=arr.splice(i,1)[0]; pStr+=char; permutate(arr,pStr,res); arr.splice(i,0,char);//恢复字符串,回溯 pStr=pStr.slice(0,pStr.length-1);//回溯 isRepeated.add(char); } } } return res; }
递归全排列法:
function Permutation(str) { let res=[]; if(str.length<=0) return res; arr=str.split("");//将字符串转化为字符数组 res=permutate(arr,0,res); res=[...new Set(res)];//去重 res.sort();//排序 return res; } function permutate(arr,index,res){ if(arr.length==index){ let s=""; for(let i=0;i<arr.length;i++){ s+=arr[i]; } return res.push(s); }else{ for(let i=index;i<arr.length;i++){ [arr[index],arr[i]]=[arr[i],arr[index]];//交换 permutate(arr,index+1,res); [arr[index],arr[i]]=[arr[i],arr[index]];//交换 } } return res; }
第三题:找出数组中重复数字
function findSame(arr) { let map = {}, res=[]; for (let i = 0; i < arr.length; i++) { if (!map[arr[i]]) { map[arr[i]] = 1; } else { map[arr[i]]++; } } for (let i in map) { if (map[i] > 1) { res.push(i); } } return res; }
第四题:转换obj
var obj =[ {id: 1, parent: null}, {id: 2, parent: 1}, {id: 3, parent: 2}, ] function transform(obj, index) { let node; if(obj.length - 1 == index){ node = { id: obj[index].id, parent: obj[index].parent } }else{ node = { id: obj[index].id, parent: obj[index].parent, child: transform(obj,++index) } } return node; } let obj2 = { obj: transform(obj, 0) } console.log(obj2);
第五题:实现log函数
function log(...args){ let str = args.join(" "); return "(app)"+str; }
第六题:实现继承。
继承主要是通过原型链来实现的,在这里主要实现下组合继承
function SuperType(){} function SubType(){ SuperType.call(this,...args);//args为一些需要继承的属性 } SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType();
第七题:let a = new A("test");发生了什么?
1.先对A构造函数RHS查询标识符。
2.使用new 调用构造函数A
//创建一个新的对象,并设置__proto__
//将构造函数的作用域赋值给新对象(因此this就指向了这个新对象)
//执行函数中的代码(为这个对象添加新的属性)
//返回这个新的对象
//将构造函数的作用域赋值给新对象(因此this就指向了这个新对象)
//执行函数中的代码(为这个对象添加新的属性)
//返回这个新的对象
3.创建变量a,并把之前的调用结果赋值给变量a
下面是new的原理实现
//实现一个new方法 function New(f) { //返回一个func return function () { var o = {"__proto__": f.prototype}; f.apply(o, arguments);//继承父类的属性 return o; //返回一个Object } }
第八题:dom操作
let p = document.createElement("p"); p.setAttribute("class", "pdd-slogan"); p.textContent = "多拼多实惠" div.appendChild(p); document.body.appendChild(div);
#拼多多##题解##前端#