2023/5/30面试小结

news2024/7/4 5:50:13

一、本应会但并不会的题

1.用js写一个栈

class Stack {
  constructor() {
    this.items = [];
  }
  // 添加元素到栈顶
  push(element) {
    this.items.push(element);
  }
  // 移除栈顶元素并返回
  pop() {
    return this.items.pop();
  }
  // 返回栈顶元素
  peak() {
    return this.items[this.items.length - 1];
  }
  // 判断栈是否为空
  isEmpty() {
    return this.items.length === 0;
  }
  // 返回栈中元素个数
  size() {
    return this.items.length;
  }
}

const stack = new Stack();
stack.push(1);
stack.push(2);
console.log(stack); // Stack { items: [1, 2]}
console.log(stack.peak()); // 2
console.log(stack.pop()); // 2
console.log(stack.isEmpty()); // false
console.log(stack.size()); // 1

2.二叉树的深度优先遍历的三种实现

二叉树的深度优先遍历(Depth-First Search,DFS)是指从根节点开始,沿着一条路径尽可能向下访问每个节点,直到无法继续为止,然后返回上一个节点继续访问。具体来说深度优先遍历分为三种:

  1. 前序遍历(Preorder Traversal):根节点->左子树->右子树
  2. 中序遍历(Inorder Traversal):左子树->根节点->右子树
  3. 后序遍历(Postorder Traversal):左子树->右子树->根节点
    下面是一个使用递归实现二叉树前序、中序和后序遍历的示例代码:
// 树节点
class TreeNode {
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
}

// 二叉树
class BinaryTree {
  constructor() {
    this.root = null;
  }
  // 向树中插入新节点
  insert(value) {
    let newNode = new TreeNode(value);
    // 如果根节点不存在则将新节点设置为根节点,否则递归插入节点
    if (!this.root) {
      this.root = newNode;
    } else {
      this.insertNode(this.root, newNode);
    }
  }
  // 递归地插入节点 左中右
  insertNode(node, newNode) {
    if (newNode.value < node.value) {
      // 新节点在左侧的情况
      if (!node.left) {
        // 左侧没节点直接插入
        node.left = newNode;
      } else {
        // 左侧有节点递归插入
        this.insertNode(node.left, newNode);
      }
    } else {
      // 新节点在右侧的情况
      if (!node.right) {
        // 右侧没节点直接插入
        node.right = newNode;
      } else {
        // 右侧有节点递归插入
        this.insertNode(node.right, newNode);
      }
    }
  }
  // 先序遍历 根->左->右  要传入一个节点参数
  preOrderTraversal(root, result = []) {
    if (root) {
      // 访问根节点
      result.push(root.value);
      // 再访问左子树
      this.preOrderTraversal(root.left, result);
      // 再访问右子树
      this.preOrderTraversal(root.right, result);
    }
    return result;
  }
  // 中序遍历 左->根->右
  inOrderTraversal(root, result = []) {
    if (root) {
      // 访问左子树
      this.inOrderTraversal(root.left, result);
      // 访问根节点
      result.push(root.value);
      // 访问右子树
      this.inOrderTraversal(root.right, result);
    }
    return result;
  }
  // 后序遍历 左->右->根
  postOrderTraversal(root, result = []) {
    if (root) {
      this.postOrderTraversal(root.left, result);
      this.postOrderTraversal(root.right, result);
      result.push(root.value);
    }
    return result;
  }
}

// 测试
const binaryTree = new BinaryTree();

binaryTree.insert(4);
binaryTree.insert(2);
binaryTree.insert(7);
binaryTree.insert(1);
binaryTree.insert(3);
binaryTree.insert(10);
binaryTree.insert(8);
binaryTree.insert(5);
console.log(binaryTree.preOrderTraversal(binaryTree.root)); // [4, 2, 1, 3, 7, 5, 10, 8]
console.log(binaryTree.inOrderTraversal(binaryTree.root)); // [1, 2, 3, 4, 5, 7, 8, 10]
console.log(binaryTree.postOrderTraversal(binaryTree.root)); // [1, 3, 2, 5, 8, 10, 7, 4]

在这里插入图片描述

3.Vue2到Vue3实现响应式为什么要从Object.defineProperty()转为使用Proxy代理

在Vue 2中,对象响应式是通过Object.defineProperty()来实现的。但是这种方式存在一些局限性,比如无法监测到新增属性和删除属性。另外,由于Object.defineProperty()只能对属性进行劫持,所以需要遍历对象的每个属性进行劫持,性能不够优秀。

Vue 3中引入了Proxy代理,它能够监测到更多类型的变化,包括新增属性和删除属性。同时,它可以一次性监听整个对象,而不需要遍历每个属性,因此在性能方面比Object.defineProperty()更加优秀。

除此之外,使用Proxy代理还可以实现更为复杂的监听操作,比如监听数组的变化、深度监听等。因此,在Vue 3中采用Proxy代理来实现响应式更加灵活和高效。

4.实现{name:‘xiaoming’,id:0, age:18}->‘name=xiaoming&id=0&age=18’

const obj = {
  name: "xiao5",
  id: 0,
  age: 18,
};
function objToQueryString(obj) {
  return Object.keys(obj)
    .map((key) => key + "=" + obj[key])
    .join("&");
}
const result = objToQueryString(obj);
console.log(result); // name=xiao5&id=0&age=18

5.如何实现一个抽象类,抽象类和普通类有什么不同

在ES6中可以通过class关键字和constructor方法来实现一个类,但是ES6并没有提供直接创建抽象类的关键字。不过,我们可以通过在类中定义抽象方法来模拟实现一个抽象类

一个抽象方法就是只有方法签名,而没有具体实现的方法。在ES6中,我们可以通过抛出错误的方式来提示子类必须实现该抽象方法

以下是实现抽象类的示例代码:

// 定义一个抽象类Animal
class Animal {
  constructor(name) {
    this.name = name;
  }
  
  // 声明一个抽象方法speak,该方法必须由子类继承并且实现
  speak() {
    throw new Error('This method must be implemented by the subclass.');
  }
}

// 继承自Animal的子类
class Dog extends Animal {
  constructor(name, breed) {
    super(name);
    this.breed = breed;
  }
  
  // 实现抽象方法speak
  speak() {
    console.log('Woof!');
  }
}

const myDog = new Dog('Buddy', 'Labrador');
myDog.speak(); // 'Woof!'

普通类和抽象类的主要区别在于,抽象类不能被实例化,它只能作为其他类的基类(父类)来使用抽象类强制要求子类必须实现某些方法或属性,而普通类则没有这种要求,子类可以选择性地覆盖父类的方法和属性。

另外,抽象类中可以定义抽象方法,而普通类中只能定义具体方法抽象方法没有具体的实现,必须在子类中覆盖实现;而具体方法有实现,在子类中可以继承或者重写。

6.Array的静态方法有哪些

Array中的静态方法是指挂载在Array构造函数上而不是Array.prototype上的方法。常见的Array静态方法有以下几个:

Array.isArray()
判断一个值是否为数组,返回布尔值。

Array.from()
从类似数组或可迭代对象创建一个新的数组实例。可以接受第二个参数来对每个元素执行一个map函数。

Array.of()
创建一个包含任意数量的参数的新数组实例。这个方法用起来更加方便,不需要使用数组字面量或者apply函数了。

Array.prototype.concat()
合并两个或多个数组,返回一个新的数组实例。

Array.prototype.forEarch()
遍历数组的所有项,并向回调函数传递每一项和该项在数组中的索引。

Array.prototype.map()
创建一个新的数组,其中每个元素都是原始数组的处理结果。

Array.prototype.filter()
创建一个新的数组,其中只包含原数组中经过过滤器回调函数处理后返回true值的元素。

Array.prototype.reduce()
将数组中的所有项累加到一个单独的数值中。

Array.prototype.some()
检查数组里是否有至少一个项通过回调函数的测试。

Array.prototype.every()
检查数组中每项是否都通过回调函数的测试。

我们可以调用这些静态方法以便更好地操作数组的数据和结构。

二、总结

1.408基础不扎实,多回顾,多记忆,多思考

2.编程能力薄弱,多刷算法题

3.前端三小件基础不扎实,多加练习

4.语言组织能力弱,很多知识点不能表述清晰,多尝试口述知识点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/589629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HashMap有哪些线程安全的处理方式(面试题)

HashMap有哪些线程安全的处理方式&#xff08;面试题&#xff09; 概念1. synchronizedMap(Map<K,V> m)2. ConcurrentHashMapConcurrentHashMap Jdk1.7 vs Jdk1.8 概念 基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作&#xff0c;并允许使用 null 值和 null…

数字孪生3D可视化技术在数字化水利行业中的应用

城市供水数字孪生系统是一种基于web3d开发和数字孪生技术构建的智能运维系统&#xff0c;它可以将实际设备与虚拟模型相结合&#xff0c;实现对城市供水系统的实时监测、预测和优化。 智慧供水系统是智慧水务建设的新目标与新高度&#xff0c;能够实现城市内部原水供水以及污水…

ASEMI单向可控硅BT169D参数,BT169D规格,BT169D大小

编辑-Z 单向可控硅BT169D参数&#xff1a; 型号&#xff1a;BT169D 断态重复峰值电压VDRM&#xff1a;600V 平均通电电流IT(AV)&#xff1a;0.6A R.M.S通电电流IT(RMS)&#xff1a;0.8A 通态浪涌电流ITSM&#xff1a;10A 平均栅极功耗PG(AV)&#xff1a;0.1W 峰值门功率…

Curl【实例 01】curl下载使用及cmd实例脚本分享(通过请求下载文件)

Curl 官方下载地址 可下载不同平台不同版本的安装包。 这里写目录标题 1.是什么1.1 curl1.2 bat和cmd 2.常用命令2.1 发送GET请求并显示响应头信息2.2 显示详细的请求和响应信息2.3 限制重定向次数2.4 带Json数据的Post请求发送2.5 带文件的Post请求发送2.6 使用代理服务器发送…

付费订阅故事难讲,腾讯音乐如何“过河”?

作者 | 艺馨 豆乳拿铁 排版 | Cathy 监制 | Yoda 出品 | 不二研究 腾讯音乐如何“过河”&#xff1f; 近日&#xff0c;腾讯音乐娱乐集团&#xff08;下称“腾讯音乐”&#xff0c;01698.HK&#xff09;公布了2022全年及2023年一季度财报。 腾讯音乐是一家提供在线音乐及…

使用 LangChain 和 Elasticsearch 的隐私优先 AI 搜索

作者&#xff1a;Dave Erickson 在过去的几个周末里&#xff0c;我一直在 “即时工程” 的迷人世界中度过&#xff0c;并了解像 Elasticsearch 这样的矢量数据库如何通过充当长期记忆和语义知识存储来增强像 ChatGPT 这样的大型语言模型 (LLM)。 然而&#xff0c;让我和许多其他…

波奇学STL:String入门和迭代器

目录 ​编辑 Constructor/Destructor/Operator Constructor:构造函数 Iterator:迭代器 begin()/end():迭代器像指针一样访问问函数 个人对迭代器的理解 rbegin()/rend():迭代器反向移动 除了用迭代器访问元素外string类还可以[]下标 Capacity:容量&#xff1f; s.siz…

Hystrix入门使用 服务熔断 服务降级 服务雪崩

一、概念 hystrix停止更新&#xff0c;理念优秀。 分布式系统面临的问题: 对于复杂的分布式体系&#xff0c;有数十个依赖&#xff0c;依赖不可避免的错误。 服务会出现雪崩&#xff0c;高可用受到破坏。 Hystrix就是用于解决分布式系统延迟和容错的开源库。 保证在一个依赖出…

Python五彩气球

文章目录 前言Turtle基础1.1 Turtle画板1.2 Turtle画笔1.3 Turtle画图1.4 Turtle填色1.5 Turtle写字 五彩气球气球类漂浮函数气球函数六一祝福 尾声 前言 六一要来啦&#xff0c;快来领取博主精心准备的五彩气球吧&#xff01; Turtle基础 小海龟(Turtle)是Python中画图的一…

SpringBatch历史数据的清理方案及实现

SpringBatch历史数据的清理方案及实现 需求背景 SpringBatch的程序已经运行了将近一年&#xff0c;数据量已经达到了一定的数据量级别。 对SpringBatch历史数据的清理也被提上日程。 但是SpringBatch的代码中似乎没有找到清理历史数据的代码&#xff0c;在官方文档中也没有…

一、STM32程序下载软件_FlyMCU

1、软件简介 (1)FlyMCU是一款STM32下载程序的软件。 (2)FlyMCU采用ISP下载方式。 (3)ISP&#xff1a;在线系统编程。 (4)FlyMCU支持STM32F1、STM32F2、STM32F4系列&#xff0c;其他暂不支持&#xff0c;后续应该也不会更新了。 (5)STM32芯片的ISP下载&#xff0c;只能使用…

LINUX系统编程-----中

文章目录 进程间的通信管道popen 和 pclosepipeFIFO 共享内存system V 版本的共享内存创建/获取共享内存 共享内存涉及的函数共享内存的通信两个进程同时对共享内存进行读写 信号量使用信号量保护共享资源消息队列死锁 信号内核不可中断状态 进程间的通信 管道 在操作系统中&…

【备战秋招】每日一题:4月1日美团春招(二批)第三题:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…

Electron简单开发

文章目录 1.参考网站2.HelloWold编写2.1新建空文件夹2.2node初始化2.3安装electron依赖2.4添加.gitignore 文件2.5创建main.js文件和index.html2.6运行electron应用 3.打包 接到一个任务&#xff0c;将electron集成到solidworks中&#xff0c;所以记录一下electron的简单操作&a…

【操作系统】05.文件管理

文件管理 文件的属性 文件内部数据的组织 文件之间的组织 操作系统向上层提供功能 创建文件 删除文件 打开文件 关闭文件 读文件 写文件 文件的逻辑结构 无结构文件 有结构文件 顺序文件 文件的物理结构 磁盘块&#xff08;文件块&#xff09; 连续分配 优点 对于机…

操作系统 四、文件管理

文章目录 4.1 文件的逻辑结构4.2 文件目录4.2.1 目录结构4.2.1.1 单级目录结构4.2.1.2 两级目录结构4.2.1.3 多级目录结构4.2.1.4 无环图目录结构 4.2.2 索引结点(FCB的改进) 4.3 文件的物理结构4.3.1 连续分配4.3.2 链接分配4.3.2.1 隐式链接4.3.2.2 显式链接 4.3.3 索引分配 …

稠密点云获取方法(二)

作为高分辨率三维重建的方法之一,从单张图像生成稠密三维点云在计算机视觉领域中一直有着较高的关注度。 以下文献提出了一种针对二维和三维信息融合的方法以解决三维点云稀疏难以检测远处的目标的问题。 Multimodal Virtual Point 3D Detection 该文献提出一种将 RGB 传感器…

【Mysql】| 超详细常见bug及解决方案

目录 一. &#x1f31f; 引入话题二. &#x1f31f; 引出bug1.1 查看bug1.2 Problem Solving2.1 查看bug2.2 Problem Solving3.1 字段长度异常3.2 Problem Solving 三. &#x1f31f; 最后 一. &#x1f31f; 引入话题 MySQL是一款广泛使用的开源数据库管理系统&#xff0c;它…

小白了解Docker容器技术

一、什么是Docker&#x1f451; 有一个最常见的例子来很好的帮我们简单了解Docker容器技术&#xff1a; 当我们在一台计算机中配置好了环境&#xff0c;花费了极大的时间和精力成功开发部署好了一个应用。准备尝试在不同操作系统、不同环境下部署这个应用时&#xff0c;我们需要…

图及其与图相关的算法

⭐️前言⭐️ 本篇文章主要介绍图及其与图相关的算法 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主…