1. 牛客网笔试(五道编程题,每题100分)
- 输入一个区间【l,r】,请问里面有没有能组成三角形三边的三个数。思考了四十分钟,最后发现其实大于一的连续整数都行,例如(2,3,4)
 
// 根据三角形三边关系
// abc分别为从短到长
// 两短边之和大于长边
// 1 和谁都组不了
var line=readline();
var lines = line.split(" ");
var left = parseInt(lines[0]);
var right = parseInt(lines[1]);
function matchesGirl(l, r){
    let a = l,b,c;
    if(a === 1){
        a = 2;
    }
    if(a + 1 <= r){
        b = a + 1;
    }else{
        print("NO");
        return;
    }
    if(a + 2 <= r){
        c = a + 2;
    }else{
        print("NO");
        return;
    }
    print("YES");
    print(a + " " + b + " " + c);
}
matchesGirl(left,right)
  - 字符串解密问题,一个单词奇数位抽出来做前半部分,偶数位倒序后做后半部分,拼接起来,形成一个串,你要解密出原来的字符串。加密过程 “Welcome” --》 “wloe” + “mce”,你要做加密算法。
 
// 倒序
function reverse(str){
    var result = '';
    for(let k = str.length - 1; k >=0; k--){
        result += str[k];
    }
    return result;
}
// 解码
function _decode(word){
    var len = word.length;
    var mid = Math.floor((len-1)/2);
    var left = word.slice(0,mid + 1);
    var right = reverse(word.slice(mid + 1));
    // 解码
    var result = "";
    for(let j = 0; j < left.length; j++){
        result += left[j];
        if(j < right.length){
            result += right[j];
        }
    }
    return result;
}
var n = parseInt(readline());
var lines = readline().split(" ");
var res = lines.map(d => _decode(d)).join(" ");
// 打印输出
print(res);
  - 没读懂,应用题
 - 没读懂,二叉树
 - 读懂了不会。香槟塔,从最上面开始倒酒,问(i,j)个酒杯被倒满需要多少杯酒。
 
2. 一面(视频问答,编程时间多一点)
- 自我介绍
 - 自己平时怎么学习前端(跟老师做项目)
 - TCP,UDP(TCP稳定,UDP不稳定,讲的很模糊)
 - 了解哪些树(二叉树,红黑树,B树),二叉树有哪些类。(完全二叉树等等…)
 - 302和304(304 NOT MODIFIED)
 - js依赖模块(import, require)
 - ES6(用过),写一个async/await(…) 实现sleep函数(我知道需要return一个Promise对象,但我不会写)
 
(async () => {
	document.querySelector('#root').innerText = '1'
	await sleep(1000)
	document.querySelector('#root').innerText = '2'
})()
// 实现sleep函数,当时没写出来,现在查资料,补上
function sleep(time){
	return new Promise(function(resolve, reject) {
		setTimeout(resolve, time);
	})
}
  -  
开始编程吧(好)
 -  
function findNumCount(arr, num)实现一个函数,两个参数,第一个是数组,第二是要找的元素,返回元素出现的次数
(for循环…)
已经排序的数组呢?
(灵机一动,二分查找!)
(然后码了一遍,没有实际运行,但是思路大概对吧。) -  
function time(hour, min)实现一个函数,给你输入0-11的小时,0-59的分钟,画出一个手表。。。
(我略微思考觉得不会做,灵机又一动,就说canvas吗老师,canvas我不会)
CSS就行
(吐血…,画div吗老师)
然后老师提醒我怎么写,我就写了半个点!
最后老师看时间快一个点了,就停了。
(我自信地说老师我实现的还行吧)
你的时针比分针长啊!
(…)
输入6:30,你的时针还指的是6!!!
(…)
(当时这题就完事了,下面附上的代码是我之后自己总结更正的版本,供大家参考) -  
最后你还有什么想问的吗?
(老师你们平时项目用的技术栈,框架都是什么?)
React
(你们做移动端吗,小程序?)
我们做小程序 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="root">
        <div id="clock"></div>
        <div class="pointer" id="hour"></div>
        <div class="pointer" id="min"></div>
    </div>
    <style> #clock { position: absolute; top: 0; left: 0; width: 100px; height: 100px; border: 1px solid black; border-radius: 50px; } .pointer { position: absolute; top: 50px; left: 50px; border-top: 1px red solid; transform-origin: 0% 0%; } #hour { width: 25px; } #min { width: 40px; } </style>
    <script> function time(hour, min) { var hourDiv = document.getElementById("hour"); var minDiv = document.getElementById("min"); var minDeg = min / 60 * 360 - 90; var hourDeg = hour / 12 * 360 + (min / 60) * (360 / 12) - 90; hourDiv.style.transform = `rotate(${hourDeg}deg)`; console.log(hourDiv.style.transform); minDiv.style.transform = `rotate(${minDeg}deg)`; console.log(minDiv.style.transform); } time(6, 35); </script>
</body>
</html>
  3. 二面(视频问答,注重基础)
- HTML
<meta>标签(charset=“utf-8”) - 注册功能的话需要用到哪些标签(form,input,button)input类型(text,button,radio,checkbox,file,password)
 - 画几何图形的有哪些技术(CSS,canvas,svg; webGL?)
 - 前端存储(Cookie,localStorage)
 - http头信息(content-type,cache-control, accept)
 - web缓存机制(…)
 - 盒模型(border,padding,margin,content)浏览器间的区别
 - flex布局(弹性布局)
 <script></script>与DOM渲染次序(defer, async)- JavaScript继承(1. 构造函数和原型;2. ES6 class)
 - 跨域和JSONP(三不同;script标签不受跨域限制)
 - 事件模型和事件代理(高程书上叫事件流和事件委托)
 - VUE生命周期,created和mounted(created时data有了,mounted时DOM渲染完毕)
 - vue组件间通信(props/emit, provide/inject, broadcast/dispatch)
 - node.js做过吗
 - GET/POST区别(查询字符串;请求body;安全性)
 - 开始编程
 - this指向
 
// 以下代码输出什么结果,this.name中this指向什么:
window.name = 'ByteDance';
function A () {
   this.name = 123;
}
A.prototype.getA = function(){
        console.log(this);
        return this.name + 1;
}
let a = new A();
let funcA = a.getA;
funcA();
  - 事件队列(steTimeout不是立即执行)
 
// 输出顺序是啥
console.log('begin')
setTimeout(() => {
        console.log('setTimeout 1')
        Promise.resolve().then(() => {
                console.log('promise 1')
                setTimeout(() => {
                        console.log('setTimeout2 between promise1&2')
                })
        }).then(() => {
                console.log('promise 2')
        })
}, 0)
console.log('end')
  - 函数柯里化?
题目:
使用JS实现一个repeat方法,
function repeat (func, times, wait) { /* your code */ }
const repeatFunc = repeat(alert, 4, 3000), 调用这个 repeatedFunc(“hellworld”),会alert 4次 helloworld, 每次间隔3秒 
function repeat(func, times, wait){
	return function(arg){
		var count = 1;
		var intervalId = setInterval(function(){
			func(arg);
			count === times ? clearInterval(intervalId) : count++;
		}, wait);
	}
}
  - 事件代理(我是面试完才觉得这道题就是考事件委托的)
 
<!-- 点击每个列表,就打印其中内容 -->
<ul>
	<li>111</li>
	<li>222</li>
	<li>333</li>
</ul>
<script> // 这种实现有问题,列表选项比较多的时候有性能问题 var lists = document.getElementsByTagName("li"); for(let i = 0; i < lists.length; i++){ lists[i].addEventListener("click", function(e){ console.log(e.target.innerHTML); }) } // 改进的方法是,在父级元素上绑定事件,当场只是说了,没有具体实现 // 高级程序设计第三版403页事件委托 var unOrderList = document.getElementsByTagName("ul")[0]; console.log(unOrderList); unOrderList.addEventListener("click",function(e){ e.preventDefault(); // 取消默认 e.stopPropagation(); // 组织冒泡 console.log(e.target.innerHTML); }) </script>
  - Flex布局,实现一个输入框宽度自适应
 
<div class="wrap">
	<input class="input"/>
	<button>确认</button>
</div>
<style> .input{ width: 100%; } .wrap{ display: flex; } </style>
  - 你了解那些排序算法?(要命题,我竟然连冒泡都不会写了)
 - 最后自由发挥,你有什么想问的吗?
(这里我问了以下老师他面试时会更注重什么,怎么从前端走向全栈,需不需要学习java和c++等语言。老师大致认为搞好javascript才是前端王道,其次有计算机相关知识。) 
4. 三面(项目+一道算法)
- 首先问了许多项目的东西,我表达能力不行,这是我不怎么擅长的东西,所以面试官很不满意吧。
 - 问了Vue的问题,我也说只会用,不太懂。然后来了一道算法题。
 - 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
 
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
 - 2 阶
 示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
 - 1 阶 + 2 阶
 - 2 阶 + 1 阶
 
// 递归
function upStairs(n){
	if(n > 2){
		return upStairs(n-1) + upStairs(n-2);
	}else if(n === 1){
		return 1;
	} else if(n === 2){
		return 2;
	}
}
  最后,三面我凉了。

京公网安备 11010502036488号