面试官:先给我发个红包 我:🧧

秋招即将到来,越来越多的求职者要开始准备面试了,充足的知识可以让你在面试官前游刃有余,但那也少不了面试过程中的一些技巧,今天就让我来给大家介绍面试中的三部曲;算法,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中,又设计出了letconst两个关键字用来定义;所以常量在后期就可以用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

在前端的面试中,对页面的设计也会进行考察,今天我们就以画出不同的图形为题;

要画出以下图形,你有哪些设计方案;在这里,我们可以通过使用边框技巧来创建特定的图形。

  1. 三角形是通过创建四个透明的边框和一个绿色的底部边框来实现的。
  2. 扇形的创建方式与三角形类似,但通常我们需要一个带有角度的边框来形成扇形的形状。
  3. 梯形是通过设置宽度和两个侧边为透明边框,底部边框为绿色来创建的。

实现代码如下:

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>

好了,今天的代码分享就到这里,你学会了吗?

相关推荐
陈随易44 分钟前
农村程序员-关于小孩教育的思考
前端·后端·程序员
云深时现月1 小时前
jenkins使用cli发行uni-app到h5
前端·uni-app·jenkins
昨天今天明天好多天1 小时前
【Node.js]
前端·node.js
亿牛云爬虫专家1 小时前
Puppeteer教程:使用CSS选择器点击和爬取动态数据
javascript·css·爬虫·爬虫代理·puppeteer·代理ip
2401_857610031 小时前
深入探索React合成事件(SyntheticEvent):跨浏览器的事件处理利器
前端·javascript·react.js
刘艳兵的学习博客1 小时前
刘艳兵-DBA033-如下那种应用场景符合Oracle ROWID存储规则?
服务器·数据库·oracle·面试·刘艳兵
雾散声声慢1 小时前
前端开发中怎么把链接转为二维码并展示?
前端
熊的猫1 小时前
DOM 规范 — MutationObserver 接口
前端·javascript·chrome·webpack·前端框架·node.js·ecmascript
天农学子1 小时前
Easyui ComboBox 数据加载完成之后过滤数据
前端·javascript·easyui
mez_Blog1 小时前
Vue之插槽(slot)
前端·javascript·vue.js·前端框架·插槽