秋招即将到来,越来越多的求职者要开始准备面试了,充足的知识可以让你在面试官前游刃有余,但那也少不了面试过程中的一些技巧,今天就让我来给大家介绍面试中的三部曲;算法,js以及页面的编写,让我们一起拿下大厂面试题。
大厂面试题
algorithm
在面试过程中,手写算法题肯定是必不可少的;面试官想要考察我们的动手能力和算法思维,今天我们就以微信中发红包的算法为例,来实现一个能够发红包的功能函数。
假设,我们把10块钱分成10个大小不一的红包 ;首先我们可以用random
生成每个红包的随机大小,而第十个红包大小,则可以用总数减掉前面红包之和表示,那我们就需要用一个数组去把每一个红包的大小储存起来,再用循环把数据存进去。
javascript
// 发红包算法
// 随机
// 公平或有趣
// 多少人,total,0.01,加起来等于total
// console.log(Math.random()); 生成[0,1)范围的数
/**
* @func 红包算法
* @param {number} total 总金额
* @param {number} num 人数
*/
function hongbao(total,num){
// 发红包的那一刻就已经决定了
// 宕机
const arr = []
// 余额
let restAmount = total;
// 未领取人数
let restNum = num;
// num-1
for(let i = 0; i < num-1; i++){
let amount = parseFloat(Math.random() * (restAmount/restNum * 2)).toFixed(2);
restAmount -= amount;
restNum--;
arr.push(amount)
}
// 最后一个人的
arr.push(restAmount.toFixed(2));
return arr
}
console.log(hongbao(20,20));
在上面的代码中,我们用Math.random() * (restAmount/restNum * 2)
去生成每个红包的大小;其中,- (restAmount/restNum * 2)
这部分则定义了随机数的上限。这里 restAmount
是剩余待分配的金额,restNum
是剩余待分配的人数。乘以 2 的原因是期望生成的随机数能覆盖一个较宽的范围 ,使得每个红包的金额都有可能较大或者较小,增加随机性。
js
除了算法题之外,面试时,对我们所学习的语言也是会进行相关的考察的;来看看在面试过程中,面试官会提哪些关于JS的知识点呢?
es5 中常量的定义
在早期es5 的代码中,只有var关键字用来定义变量 ,并没有特别设计出定义常量的关键字;这就导致在早期的js中,定义常量都是靠var关键字加上编程习惯来约定的 ,默认var PI = 3.1415926;
定义PI就是常量。
到2016年es6 版本发行之后,js才有了定义常量的关键字;在es6中,又设计出了let
和const
两个关键字用来定义;所以常量在后期就可以用const
关键字来定义 ,const PI = 3.1415926;
,逐渐走向规范化。
use strict 严格模式
use strict
是JavaScript中的一种运行模式,旨在提供更安全、更严谨的编程环境 。在严格模式下,JavaScript引擎会对代码执行更严格的检查,帮助开发者避免一些常见的错误和不良实践。use strict
指令应该放在脚本或函数的顶部。
javascript
"use strict"; // 严格模式
(function(){
// 有什么方式a 可以来到全局作用域
a = 1
})()
// var a = 2
console.log(a);
在上面的代码中,并不能够打印出a
的值,这是因为在严格模式下,a
并没有在全局中被声明 ,所以会报错;如果上述代码是在在非严格模式下,这将创建一个全局变量 a
。
Object.defineProperty
Object.defineProperty()
是 JavaScript 中的一个方法,用于直接在一个对象上定义一个新属性,或者修改一个现有属性的特性和值,并返回该对象。
如果给对象中新增变量属性,是没有必要使用这个函数的,这个函数中有三个参数:value,writable和configurable ;利用当中的writable: false
,我们可以实现往对象中添加一个(常量)静态属性并且不会被修改。
javascript
// var PI = 3.1415926
var myObj = {
// PI: 3.1415926
}
Object.defineProperty(myObj,'PI',{
value: 3.1415926,
writable: false,
configurable: true // 属性可以被重新配置
})
console.log(myObj.PI);
Object.freeze()
Object.freeze()
是 JavaScript 中的一个方法,用于冻结一个对象 ,使其成为不可变的 。一旦一个对象被冻结,就不能再向其添加新的属性,不能删除已有的属性,也不能改变已有属性的特性或值(如果它们是数据属性)。这使得 Object.freeze()
成为一种确保对象完整性、保护对象不被无意或恶意修改的强大工具。
ini
const obj = {
prop: 42,
};
Object.freeze(obj);
obj.prop = 33;
// Throws an error in strict mode
console.log(obj.prop);
可以看到,对象obj
身上的属性并没有被修改掉,而是保持之前的值。
css
在前端的面试中,对页面的设计也会进行考察,今天我们就以画出不同的图形为题;
要画出以下图形,你有哪些设计方案;在这里,我们可以通过使用边框技巧来创建特定的图形。
- 三角形是通过创建四个透明的边框和一个绿色的底部边框来实现的。
- 扇形的创建方式与三角形类似,但通常我们需要一个带有角度的边框来形成扇形的形状。
- 梯形是通过设置宽度和两个侧边为透明边框,底部边框为绿色来创建的。
实现代码如下:
xml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>css 画图形</title>
<style>
.circle{
width: 100px;
height: 200px;
background-color: green;
border-radius: 50%;
}
.triangle{
width: 0;
height: 0;
border: 100px solid transparent;
border-bottom: 100px solid green;
border-radius: 50%;
transform: rotate(90deg);
}
.sector{
width: 0;
height: 0;
border: 100px solid transparent;
border-bottom-color: green;
}
.trapezoid{
width: 70px;
height: 0;
border: 100px solid transparent;
border-bottom: 100px solid green;
}
</style>
</head>
<body>
<div class="circle"></div>
<div class="triangle"></div>
<div class="sector"></div>
<div class="trapezoid"></div>
aaa
</body>
</html>
好了,今天的代码分享就到这里,你学会了吗?