广州-斗友前端笔试题
时间:2023-03-30 23:09:37
CSS
这是我面试的第三家公司==奋进。说实话,笔试题手写代码真的很难受==,面试的时候没让我实现思路和答案(那我笔试有什么意义),面试结束的时候,有被三个灵魂拷问:你觉得自己做前端有什么优势??你认为你最有成就感的项目是什么?印象最深刻的项目是什么?话不多说,直入正题!1、对于一个定宽不定高的元素,如何实现水平居中和垂直居中?html文档
fleximplementation.parent{display:flex;证明内容:居中;对齐项目:居中;高度:100px;border:1pxsolidred;}.child{width:100px;border:1pxsolidred;}position实现几种常用的margin写法默认值:margin:0;margin:10px;//外距离都是10pxmargin:10px20px;//上下边距为10px,左右边距为20pxmargin:10px20px30px;//上边距为10px,左右边距为20px,下边距为30pxmargin:10px20px30px40px;//边距方向从左到右依次为上、右、下、左.parent{height:100px;边框:1px纯红色;位置:相对;}.child{位置:绝对;宽度:100px;顶部:50%;左:50%;transform:translate(-50%,-50%);}这里有个小问题:为什么要设置margin:auto;将水平居中,而不是垂直居中?这不是说auto是一个自动计算的属性吗?2、下面三段代码的输出结果是什么?它什么时候输出什么?for(vari=0;i<5;i++){setTimeout(function(){console.log(i)},1000*i)}for(le我=0;我<5;i++){setTimeout(function(){console.log(i)},1000*i)}for(vari=0;i<5;i++){(function(i){setTimeout(function(){控制台。log(i)},1000*i)})(i)}答案:很短的时间内输出5,然后每秒输出一个5//55555很短的时间内输出0,然后每秒给结果加1//01234很短的时间内输出0,然后每秒给结果加1//01234分析:1.首先,我们必须了解js的事件循环机制。for循环结束后,宏任务setTimeout到来。此时i的值已经变成了5。2.leti是块作用域,类似于for(leti=0;i<5;i++){leti=/*iinsidetheblockscope*/setTimeout(function(){console.log(i)},1000*i)}这样每一次循环,i的值就是块作用域中的值3.立即执行函数并创建自己的作用域,所以每次执行是不同的i3。以下代码的输出是什么?vara=1;varobj={a:2,func1:()=>{console.log(this.a);},func2:function(){console.log(this.a);}}varobj2={a:3};console.log(obj.func1());console.log(obj.func2());obj.func2.apply(obj2);varnewFunc=obj.func2;新功能();答案:vara=1;varobj={a:2,//注意箭头函数的this点是在定义的时候绑定的,不是在执行的时候绑定的,所以func1的this指向一个空对象func1:()=>{console.日志(吨他.a);},func2:function(){console.log(this.a);}}varobj2={a:3};console.log(obj.func1());//函数没有返回值,会先打印undefined,函数体内是this指向undefined的箭头函数,所以也会打印undefinedconsole.log(obj.func2());//函数没有返回值,首先会打印undefined,函数体里面是一个普通的匿名函数this指向obj,所以也会打印出2obj.func2.apply(obj2);//显式的把this指向obj2,所以print3varnewFunc=obj.func2;newFunc();//在全局环境中调用func2函数。此时this指向全局变量window,打印14。实现一个函数:输入一个整数,找出整数的二进制表示中有多少个1?我的答案://十进制转换为二进制——除以2和余数方法functiontoBinary(number){letarr=[]while(number>0){leta=number%2number=(number-a)/2arr.push(a)}returnarr.reverse()}//过滤掉包含1的数组//一次遍历的时间复杂度为Nleta=toBinary(1223).filter(item=>item===1)安慰。log(a.length)//要得到多少个1我的回答://暴力2循环,复杂度n^2functiongetMostChart(str){letlist=[...str];//将字符串拆分成一个数组letnoRepeatList=Array.from(newSet(list))//合并数组中重复的元素letlengthList=[]//noRepeatList一个数组,由每一项在数组中出现的次数组成listnoRepeatList.map(ele=>{letcount=0;list.map(item=>{if(ele===item){count++}})lengthList.push(count)//[1,1,2,1,1]})letmax=lengthList[0]//获取最大值及其下限Standardfor(leti=0;i
最大?max=current:null}//注意这里的maxIndex可能不止一个,最好通过for循环获取最大值的下标letmaxIndex=lengthList.findIndex(item=>item===max)returnnoRepeatList[maxIndex]}getMostChart('choose')//o我的回答不够好??,忽略了出现次数最多的字符的可能性会有很多,比如'ccoo'使用了网上的JSON特性,时间复杂度仅为N。6.实现一个单向链表类,需要支持增删查查。Answer/***定义一个节点类*/classNode{constructor(val){this.val=val;//节点值this.next=null;//节点指针,指向下一项}}/***定义一个单向链表类*/classLinkedList{constructor(){this.headNode=newNode('head');//初始化一个头节点}//添加一个新节点insert(val){letcurrentNode=this.headNode,lastNode=newNode(val);while(true){if(currentNode.next==null){中断;}else{currentNode=currentNode.next;}}lastNode.next=currentNode.next;currentNode.next=lastNode;}//删除链表中的一项remove(val){letcurrentNode=this.headNode;while(true){if(currentNode.next.val==val){中断;}else{currentNode=currentNode.next;}}currentNode.next=currentNode.next.next;}//查找search(val){letcurrentNode=this.headNode;while(currentNode.next){currentNode=currentNode.next;if(currentNode.val===val){returncurrentNode}}}}}varnodes=newLinkedList();nodes.insert('a');nodes.insert('b');nodes.insert('c');console.log(nodes.search('c'));//Node{val:'orange',next:null}我的回答未必正确和优秀,分析也可能不够充分。欢迎留言指正或补充