面经-2022-秋招-华为一面


[TOC]

1.算法题

碰撞检测算法,给定一个数组表示一系列行星。对于数组的每一个元素,其绝对值表示行星的大小,正负表示行星移动的方向(正表示向右移动,负表示向左移动)找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星永远不会发生碰撞

用例:
[5, 10, -5] => [5,10]
[8, -8] => []
[10, 2, -5] => [10]
[-2, -1, 1, 2] => [-2, -1, 1, 2]

思路:

这个代码首先将所有行星放入一个队列中。然后,当队列中还有两个以上的行星时,它会取出两个行星进行碰撞检测。

如果两个行星的方向相同,它们就不会碰撞,会被重新放入队列中。

如果第一个行星较小,它会爆炸,第二个行星会被放入队列中。

如果第二个行星较小,它会爆炸,第一个行星会被放入队列中。

如果两个行星大小相同,它们都会爆炸,并且两个行星都会被重新放入队列中。

最后,如果队列中还有一个或更多的行星,就说明没有发生碰撞,返回所有剩余的行星。

import java.util.LinkedList;  
import java.util.Queue;  
  
public class Main {  
    public static void main(String[] args) {  
        int[] planets = {5, 10, -5};  
        System.out.println(collision(planets));  
    }  
  
    public static int[] collision(int[] planets) {  
        Queue<Integer> queue = new LinkedList<>();  
        for (int planet : planets) {  
            queue.offer(planet);  
        }  
  
        while (queue.size() > 1) {  
            int first = queue.poll();  
            int second = queue.poll();  
            if (first * second > 0) { // 方向相同,不会碰撞  
                queue.offer(first);  
                queue.offer(second);  
            } else if (Math.abs(first) < Math.abs(second)) { // 第一颗行星较小,爆炸  
                queue.offer(second);  
            } else if (Math.abs(second) < Math.abs(first)) { // 第二颗行星较小,爆炸  
                queue.offer(first);  
            } else { // 两颗行星大小相同,都爆炸  
                queue.offer(first);  
                queue.offer(second);  
            }  
        }  
  
        // 如果队列中还有元素,说明没有碰撞,返回所有剩余行星  
        return queue.toArray(new int[0]);  
    }  
}

2.Vue生命周期有哪些

Vue的生命周期是指Vue实例从创建、初始化、渲染、更新到销毁的全过程。以下是Vue的生命周期钩子:

  1. beforeCreate:实例被创建之初,响应式数据和事件尚未初始化。
  2. created:实例创建完毕,响应式数据和事件已初始化,但尚未挂载DOM。
  3. beforeMount:模板编译/挂载之前。可以在此时进行数据渲染前的准备工作。
  4. mounted:模板编译/挂载之后。可以在此时进行DOM操作或发起网络请求。
  5. beforeUpdate:数据更新之前。可以在此时进行数据更新后的准备工作。
  6. updated:数据更新之后。此时组件已经重新渲染。
  7. beforeDestroy:实例销毁之前。可以在此时执行清理工作,如取消网络请求或清除计时器等。
  8. destroyed:实例销毁之后。此时所有的事件监听器和子组件都被移除。

3.讲一讲什么是MVC

前端MVC是一种软件架构模式,用于构建前端应用程序。它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。

模型(Model):负责管理应用程序的数据,包括数据的获取、存储和更新等操作。模型通常会与后端进行数据交互,获取或更新数据。

视图(View):负责呈现数据给用户,通常是一个用户界面。视图根据模型数据来创建,并展示模型的数据给用户。视图的变化会反映模型数据的变化。

控制器(Controller):协调模型和视图之间的交互,处理用户输入和请求。控制器接收用户的输入,根据输入更新模型,并通知视图进行相应的更新。控制器充当模型和视图之间的桥梁。

4.Vue和React有什么区别

Vue和React都是前端开发中常用的框架,它们在实现方式、性能优化、数据流等方面存在一些区别。

  1. 实现方式:Vue通过一种拓展的HTML语法进行渲染,模板的原理与原生JS实现类似,更加纯粹和原生。而React则是通过JSX语法进行渲染,允许在渲染过程中使用JSX的特性。
  2. 性能优化:Vue在渲染过程中可以更快地计算出Virtual DOM的差异,因为Vue在渲染过程中会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树。而React在应用的状态被改变时,全部子组件都会重新渲染。通过shouldComponentUpdate这个生命周期方法可以进行控制,但Vue将此视为默认的优化。
  3. 框架本质:Vue本质是MVVM框架,由MVC发展而来;而React是前端组件化框架,由后端组件化发展而来。
  4. 数据流:Vue是响应式的数据双向绑定系统,而React是单向数据流,没有双向绑定。Vue中默认是支持组件间的数据双向的,但是后来废弃了这一特性,将组件间的数据双向流改成了单向流。React则一直不支持数据双向,无论是组件间还是dom元素的双向都是不支持的。React一直采用的就是onChange/setState模式,就是监听数据变化,然后调用setState方法生成新的数据。
  5. 监听数据变化:Vue通过getter/setter以及一些函数的劫持,能精确知道数据变化。而React默认是通过比较引用的方式进行的,如果不优化可能导致大量不必要的VDOM得重新渲染。

5.Vuex有哪些使用场景?为什么使用?Vuex的实现原理是?

使用场景:

  1. 组件之间的数据共享:当多个组件需要访问或者操作同一个数据时,可以使用Vuex进行集中管理。例如,在一个购物车页面中,多个组件需要对商品的数量、价格等信息进行操作和展示,这时可以将购物车的商品信息存放在Vuex的store中,方便不同组件之间的访问和修改。
  2. 复杂状态的管理:当应用中存在复杂的状态关系和数据交互时,可以使用Vuex进行集中管理。例如,在一个音乐播放器应用中,不同组件需要对当前播放的歌曲、播放状态、歌曲列表等进行操作和展示,使用Vuex可以将这些复杂的状态逻辑统一管理,提高代码的复用性和可维护性。
  3. 异步操作的处理:当应用中存在异步操作(如网络请求、定时器等)时,可以使用Vuex进行集中处理。

使用原因:

  1. Vuex可以集中管理组件的状态,避免组件之间的状态共享问题,降低代码的复杂性。
  2. Vuex提供了丰富的功能和工具,如模块化、状态树、异步操作等,可以帮助开发者更好地管理应用的状态。
  3. Vuex提供了可预测的状态变化方式,确保状态的变化遵循一定的规则,降低了调试的难度。

实现原理:

Vuex的实现原理主要包括以下几个部分:

  1. Store:Store是Vuex中存储状态的地方,它是一个纯对象,用于存储应用程序的状态。每个Store可以包含多个模块(module),每个模块拥有自己的state、mutation、action、getter等。
  2. State:State是用来存储应用程序的状态的地方,它是一个纯对象,可以包含任意类型的数据。在Vuex中,所有的state都是集中存储在Store中的。
  3. Mutation:Mutation是用来修改state的唯一途径,必须是同步函数。在Vuex中,只有通过mutation才能改变state中的数据。
  4. Action:Action类似于Mutation,也可以用来修改state。与Mutation不同的是,Action可以包含任意异步操作。
  5. Getter:Getter是用来对state进行计算和加工的函数,可以根据当前state返回一个新的值或者对state进行过滤等操作。
  6. Module:Module是将单一状态树分割成多个模块,每个模块拥有自己的state、mutation、action、getter等。这样可以更好地组织和管理代码。

6.Vue的路由模式有哪些?区别和实现原理是?

Vue的路由模式主要有两种:Hash模式和History模式

两种模式的实现原理如下:

  1. Hash模式:当URL中的Hash发生变化时,Vue会通过监听hashchange事件来获取Hash的变化,然后通过修改数据来更新页面。具体来说,当hash变化时,Vue会调用相应的组件来渲染页面。
  2. History模式:当用户进行页面跳转时,Vue会通过监听popstate事件来获取URL的变化,然后通过调用相应的组件来渲染页面。在History模式中,Vue会使用pushState()或replaceState()方法来修改URL,从而实现对页面的路由。

两种模式的区别在于:Hash模式使用了URL的Hash部分,而History模式使用了HTML5的History API来对URL进行操作。

7.物联网场景Web和常规Web场景有什么区别?

  1. 设备差异:物联网场景下的Web开发主要针对的是物联网设备,这些设备可能具有不同的硬件配置和操作系统,而常规Web开发主要针对的是传统计算机和移动设备。因此,开发人员需要考虑如何在不同的设备上运行和优化应用程序。
  2. 网络差异:物联网设备通常通过无线网络连接到互联网,这可能导致网络带宽和稳定性方面的问题。因此,开发人员需要考虑如何优化数据传输和应用程序的性能,以便在有限的网络资源下实现更好的用户体验。
  3. 数据处理差异:物联网设备通常会产生大量数据,这些数据需要被有效地处理和分析。因此,开发人员需要考虑如何有效地处理和分析这些数据,以便提供有用的信息和洞察。

8.HTTPS加密原理是?

HTTPS加密的过程主要包括以下几个步骤:

  1. 客户端发起HTTPS请求:客户端向服务器发送HTTPS请求,请求中包含了客户端的加密算法和密钥信息。
  2. 服务器响应:服务器收到请求后,会根据客户端提供的加密算法和密钥信息,选择合适的加密算法和生成相应的密钥。然后,服务器会用自己的私钥对生成的密钥进行加密,将加密后的密钥发送给客户端。
  3. 客户端解密:客户端收到服务器返回的加密密钥后,会使用自己的公钥对加密的密钥进行解密,得到服务器的加密密钥。
  4. 数据传输:客户端和服务器之间通过这个加密密钥进行数据的加密和解密,实现数据的安全传输。
  5. 结束通信:当通信结束后,客户端和服务器会通过SSL/TLS协议的握手过程来结束本次通信。

9.讲讲你做的负载均衡器

  1. 负载均衡算法:我的负载均衡器采用了基于权重的轮询和随机两种算法。
  2. 健康检查:健康检查功能,可以检测服务器的可用性和性能。如果服务器出现故障或者性能下降,负载均衡器会自动将其从服务列表中剔除,并将请求分发给其他健康的服务器。
  3. 会话保持:负载均衡器还支持会话保持功能,可以根据用户的会话信息将请求分发到同一个服务器上,以保证用户的会话一致性。
  4. 动态负载均衡:支持动态负载均衡,可以根据服务器的实时负载情况动态调整服务器的负载,使得请求能够根据服务器的负载情况分发到不同的服务器上。
  5. 流量控制:负载均衡器还具备流量控制功能,可以根据需要限制进入或退出系统的流量,以防止系统因流量过大而崩溃。

10.小程序和h5有啥区别?

  1. 运行环境:H5主要运行在浏览器中,而小程序则运行在特定的平台环境中,如微信、支付宝等。小程序的运行环境受到平台限制,只能在特定的平台上运行。
  2. 开发成本:小程序的开发成本相对较低,因为其开发语言和框架相对统一,而且开发工具也相对完善。而H5的开发成本相对较高,因为需要考虑到不同的浏览器和平台之间的兼容性问题。
  3. 系统权限:小程序可以获取更多的系统权限,如位置信息、摄像头等,这使得小程序能够提供更加丰富的功能和更好的用户体验。而H5所能获取的系统权限相对较少,限制了其功能和用户体验。
  4. 用户体验:小程序的功能类似于APP,可以提供更加流畅和丰富的用户体验,不需要像H5一样等待加载和刷新页面。同时,小程序也支持离线使用,即在没有网络的情况下也可以使用部分功能。
  5. 更新和维护:小程序的更新和维护需要在特定的平台上进行,而H5则可以通过普通的网页进行更新和维护。

11.Uni-app的转译原理介绍一下

  1. 平台识别:编译器能够自动识别目标平台,并根据平台特性进行相应的代码转译。
  2. 代码转换:源代码中的跨平台组件和逻辑被转换成原生组件和逻辑。例如,HTML元素会被转换成原生视图组件,CSS样式会被应用到原生组件上。
  3. API映射:Uni-app提供了一套统一的API接口,用于处理不同平台之间的差异。编译器将这些API接口转换成原生平台的API调用。
  4. 资源适配:编译器还会处理资源文件的适配问题,如图片、字体等。根据不同平台的尺寸和分辨率要求,编译器会调整资源文件的尺寸和格式。
  5. 打包部署:转译后的代码被打包成原生应用程序,可以直接部署到目标平台上运行。

12.反问环节、业务介绍

部门业务和技术栈


作者:前端LeBron
原文链接:https://juejin.cn/post/7025793782998106149


文章作者: 千羽
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 千羽 !
评论
  目录