数据结构(JS实现)

目录

  • 链表
    • 链表的特点
    • 链表中的常见操作
    • 单链表
      • append(data)尾部追加新节点
      • toString()输出链表的节点数据
      • 插入节点insert(position,data)
      • get(position)获取链表指定位置节点的数据
      • indexOf(data)查找对应数据节点的位置
      • update(position, newData)更新指定位置节点数据
      • removeAt(position)删除指定位置的节点
      • remove(data)删除第一个数据为data的节点
      • isEmpty()判断链表是否为空
      • size()返回链表长度
      • 单链表构造函数完整实现
    • 经典相关算法题
      • 链表反转
  • 数组
  • 哈希表/散列表
    • 完美二叉树(Perfect Binary Tree)/满二叉树(Full Binary Tree)
    • 完全二叉树(Compelete Binary Tree)
    • 二叉搜索树/二叉查找树/二叉排序树(Binary Search Tree,简称BST)

链表

与数组不同,我们无法在常量时间内访问单链表中的随机元素。 如果我们想要获得第 i 个元素,我们必须从头结点逐个遍历。 我们按索引来访问元素平均要花费 O(N) 时间,其中 N 是链表的长度。

  • 查找时间复杂度:O(n)

创建单向链表类

// 封装链表的构造函数
function LinkedList() {//封装一个Node类,用于保存每个节点信息function Node(data,next) {this.data = datathis.next = (next===undefined ? null : next)}// 链表中的属性this.length = 0 // 链表的长度this.head = null //链表的第一个节点
}

ES6

class LinkedList{constructor Node(data,next) {this.data = datathis.next = (next===undefined ? null : next)// 链表中的属性this.length = 0 // 链表的长度this.head = null //链表的第一个节点}
}

链表的特点

链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制完全不同。链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有的语言称为指针或连接)组成。类似于火车头,一节车厢载着乘客(数据),通过节点连接另一节车厢。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • head属性指向链表的第一个节点;
  • 链表中的最后一个节点指向null;
  • 当链表中一个节点也没有的时候,head直接指向null;

数组存在的缺点:
数组的创建通常需要申请一段连续的内存空间(一整块内存),并且大小是固定的。所以当原数组不能满足容量需求时,需要扩容(一般情况下是申请一个更大的数组,比如2倍,然后将原数组中的元素复制过去)。
在数组的开头或中间位置插入数据的成本很高,需要进行大量元素的位移。

链表的优势:
链表中的元素在内存中不必是连续的空间,可以充分利用计算机的内存,实现灵活的内存动态管理。
链表不必在创建时就确定大小,并且大小可以无限地延伸下去。
链表在插入和删除数据时,时间复杂度可以达到O(1),相对数组效率高很多。

链表的缺点:
链表访问任何一个位置的元素时,都需要从头开始访问(无法跳过第一个元素访问任何一个元素)。
无法通过下标值直接访问元素,需要从头开始一个个访问,直到找到对应的元素。
虽然可以轻松地到达下一个节点,但是回到前一个节点是很难的(单链表比较困难,双链表简单)。

链表中的常见操作

函数名是自定义的
append(element):向链表尾部添加一个新的项;
insert(position,element):向链表的特定位置插入一个新的项;
get(position):获取对应位置的元素;
indexOf(element):返回元素在链表中的索引。如果链表中没有该元素就返回-1;
update(position,element):修改某个位置的元素;
removeAt(position):从链表的特定位置移除一项;
remove(element):从链表中移除一项;
isEmpty():如果链表中不包含任何元素,返回trun,如果链表长度大于0则返回false;
size():返回链表包含的元素个数,与数组的length属性类似;
toString():由于链表项使用了Node类,就需要重写继承自JavaScript对象默认的toString方法,让其只输出元素的值;

单链表

append(data)尾部追加新节点

// 封装链表的构造函数
function LinkedList() {//封装一个Node类,用于保存每个节点信息function Node(data,next) {this.data = datathis.next = (next===undefined ? null : next)}// 链表中的属性this.length = 0 // 链表的长度this.head = null //链表的第一个节点//链表中的方法// 1.追加节点的方法append,追加是指在链表的末尾添加节点LinkedList.prototype.append = function (data) {// 首先创建节点let newNode = new Node(data)// 然后找到末尾的节点,将新创建的节点添加到末尾// 如果是空链,直接让头指针指向新节点if (this.length == 0) {this.head = newNode} else {// 从头开始查找,用current标记当前查找的位置let current = this.head// if(current==null) current=newNode // 也可以这样判断链表目前是否是空链// 否则查找链表的最后一个节点while (current.next) {current = current.next}// 最后一个节点的current.next==null,所以会跳出while循环// 让最后一个节点指向新节点current.next = newNode}// 链表长度加一this.length += 1}
}

过程详解:

  1. 首先让current指向第一个节点:
    在这里插入图片描述
  2. 通过while循环使current指向最后一个节点,最后通过current.next = newNode,让最后一个节点指向新节点newNode
    在这里插入图片描述
    测试代码
    //测试代码//1.创建LinkedListlet list = new LinkedList()//2.测试append方法list.append('aaa')list.append('bbb')list.append('ccc')console.log(list);  

结果
在这里插入图片描述

toString()输出链表的节点数据

代码实现:

LinkedList.prototype.toString =function(){let current=this.head// listString存储链表的节点数据let listString=''// 空链表不会进入该循环,content为空while(current){listString += current.data+' '// 每个节点数据后加个空格,便于阅读current=current.next}return listString
}

测试代码

    //测试代码//1.创建LinkedListlet list = new LinkedList()//2.插入数据list.append('aaa')list.append('bbb')list.append('ccc')//3.测试toString方法console.log(list.toString());

结果
在这里插入图片描述

插入节点insert(position,data)

代码

            // position的有效范围是整数[0,length]LinkedList.prototype.insert=function(position,data){let newNode=new Node(data)if(position<0|| position>=this.length){// false表示插入失败return false;}else if(position==0){//newNode成为头结点的情况// 注意顺序不能颠倒newNode.next=this.headthis.head=newNode}else{// 包含newNode成为最后一个节点的情况,与插入在中间位置一样的操作let current=this.head// 找到newNode要插入位置的前一个节点,跳出循环后current指向该节点for(let i=0;i<position;i++){current=current.next}// 顺序不能颠倒newNode.next=current.nextcurrent.next=newNode}this.length+=1// true表示插入成功return true}

过程详解:
position是节点插入链表后所处的位置,其有效范围是整数[0,length],根据插入节点位置的不同可分为多种情况:
情况1:position = 0:
通过: newNode.next = this.head,建立连接1;
通过: this.head = newNode,建立连接2;(不能先建立连接2,否则this.head不再指向Node1)
image-20200306103312580
情况2:position > 0:
在这里插入图片描述

                    // 包含newNode成为最后一个节点的情况,与插入在中间位置一样的操作let current=this.head// 找到newNode要插入位置的前一个节点,跳出循环后current指向该节点for(let i=0;i<position;i++){current=current.next}// 顺序不能颠倒newNode.next=current.nextcurrent.next=newNode

测试代码

    //1.创建LinkedListlet list = new LinkedList()//2.插入数据list.append('aaa')list.append('bbb')list.append('ccc')//3.测试insert方法list.insert(0, '在链表最前面插入节点');list.insert(2, '在链表中第二个节点后插入节点');list.insert(5, '在链表最后插入节点');alert(list)// alert会自动调用参数的toString方法console.log(list);

结果
在这里插入图片描述
在这里插入图片描述

get(position)获取链表指定位置节点的数据

	//测试代码//1.创建LinkedListlet list = new LinkedList()//2.插入数据list.append('aaa')list.append('bbb')list.append('ccc')	//3.测试get方法console.log(list.get(0));console.log(list.get(1));

在这里插入图片描述

indexOf(data)查找对应数据节点的位置

代码

// 根据数据查询数据所在链表位置
LinkedList.prototype.indexOf=function(data){let current= this.headlet index=0// 从头结点开始逐个查找数据等于data的节点while(current){if(current.data==data){return index}current=current.nextindex+=1}// 没有查找到就返回-1return -1
}

测试代码

	//测试代码//1.创建LinkedListlet list = new LinkedList()//2.插入数据list.append('aaa')list.append('bbb')list.append('ccc')	//3.测试indexOf方法console.log(list.indexOf('aaa'));console.log(list.indexOf('ccc'));

测试结果
在这里插入图片描述

update(position, newData)更新指定位置节点数据

代码

LinkedList.prototype.update=function(position,newData){// position有效取值是[0,this.length-1]间的整数,修改失败返回falseif(position<0|| position>=this.length) return false;let current=this.headlet i=0// 遍历至处于position位置的节点while(i++<position){current=current.next}// console.log(i); //position=2时,i=3,说明跳出循环i还是会自增1,因为自增运算符比比较运算符优先级高// 跳出循环时,current已经指向处于position位置的节点current.data=newDatareturn true
}

测试代码

	//1.创建LinkedListlet list = new LinkedList()//2.插入数据list.append('aaa')list.append('bbb')list.append('ccc')	//3.测试update方法console.log(list.update(0, '修改第0个节点'))console.log(list.update(2, '修改第2个节点'))console.log(list.update(3, '超出范围无法修改'));console.log(list.toString());

测试结果
在这里插入图片描述

removeAt(position)删除指定位置的节点

情况1:position = 0,即移除第一个节点(Node1)。通过:this.head = this.head.next,改变指向1即可;虽然Node1的next仍指向Node2,但是没有引用指向Node1,则Node1会被垃圾回收器自动回收,所以不用处理Node1指向Node2的引用next。
在这里插入图片描述
情况2:positon > 0,比如pos = 2即移除第三个节点(Node3)。
首先,定义两个变量previous和curent分别指向需要删除位置pos = x的前一个节点和当前要删除的节点;
然后,通过:previous.next = current.next,改变指向1即可;
随后,没有引用指向Node3,Node3就会被自动回收,至此成功删除Node3 。
在这里插入图片描述
代码

            LinkedList.prototype.removeAt=function(position){// 超出范围的删除不了if(position<0|| position>=this.length) return false;let current =this.head// 如果删除第一个节点if(position==0){this.head=this.head.next}else{let i=0;let previous=this.headwhile(i++<position){previous=currentcurrent=current.next}previous.next=current.nextthis.length--;}return current.data}

测试代码

    let list = new LinkedList()//2.插入数据list.append('aaa')list.append('bbb')list.append('ccc')//3.测试removeAt方法console.log(list.removeAt(0));console.log(list.removeAt(1));console.log(list);

测试结果
在这里插入图片描述

remove(data)删除第一个数据为data的节点

LinkedList.prototype.remove=function(data){let current= this.headlet index=0let previous=this.head// 从头结点开始逐个查找数据等于data的节点while(current){if(current.data==data){// 如果删除的是头节点if(index==0){this.head=this.head.next}else{previous.next=current.next}this.length--;return index}// previous和current指向下一个节点previous=currentcurrent=current.nextindex+=1}// 没有查找到就返回falsereturn false
}

测试代码

    let list = new LinkedList()//2.插入数据list.append('aaa')list.append('bbb')list.append('ccc')/*---------------其他方法测试----------------*///remove方法console.log(list.remove('aaa'));console.log(list)

结果
在这里插入图片描述

isEmpty()判断链表是否为空

代码

// 判断链表是否为空
LinkedList.prototype.isEmpty=function(){return this.length==0
}

size()返回链表长度

代码

// 返回链表的长度
LinkedList.prototype.size=function(){return this.length
}

测试代码

    let list = new LinkedList()//2.插入数据list.append('aaa')list.append('bbb')list.append('ccc')/*---------------其他方法测试----------------*///remove方法console.log(list.isEmpty());console.log(list.size())

结果
在这里插入图片描述

单链表构造函数完整实现

        // 封装链表的构造函数function LinkedList() {//封装一个Node类,用于保存每个节点信息function Node(data) {this.data = datathis.next = null}// 链表中的属性this.length = 0 // 链表的长度this.head = null //链表的第一个节点//链表中的方法// 1.追加节点的方法append,追加是指在链表的末尾添加节点LinkedList.prototype.append = function (data) {// 首先创建节点let newNode = new Node(data)// 然后找到末尾的节点,将新创建的节点添加到末尾// 如果是空链,直接让头指针指向新节点if (this.length == 0) {this.head = newNode} else {// 从头开始查找,用current标记当前查找的位置let current = this.head// if(current==null) current=newNode // 也可以这样判断链表目前是否是空链// 否则查找链表的最后一个节点while (current.next) {current = current.next}// 最后一个节点的current.next==null,所以会跳出while循环// 让最后一个节点指向新节点current.next = newNode}// 链表长度加一this.length += 1}// 2.返回链表各个节点的内容的方法LinkedList.prototype.toString = function () {let current = this.headlet content = ''// 空链表不会进入该循环,content为空while (current) {content += current.data + ' '// 每个节点数据后加个空格,便于阅读current = current.next}return content}// position的有效范围是整数[0,length-1]LinkedList.prototype.insert=function(position,data){let newNode=new Node(data)if(position<0|| position>this.length){// false表示插入失败return false;}else if(position==0){//newNode成为头结点的情况// 注意顺序不能颠倒newNode.next=this.headthis.head=newNode}else{// 包含newNode成为最后一个节点的情况,与插入在中间位置一样的操作let current=this.head// 找到newNode要插入位置的前一个节点,跳出循环后current指向该节点for(let i=0;i<position-1;i++){current=current.next}// 顺序不能颠倒newNode.next=current.nextcurrent.next=newNode}this.length+=1// true表示插入成功return true}LinkedList.prototype.get=function(position){// position有效取值是[0,this.length-1]间的整数if(position<0|| position>=this.length) return null;let current=this.headlet i=0// 遍历至处于position位置的节点while(i++<position){current=current.next}// console.log(i); //position=2时,i=3,说明跳出循环i还是会自增1,因为自增运算符比比较运算符优先级高// 跳出循环时,current已经指向处于position位置的节点return current.data    }// 根据数据查询数据所在链表位置LinkedList.prototype.indexOf=function(data){let current= this.headlet index=0// 从头结点开始逐个查找数据等于data的节点while(current){if(current.data==data){return index}current=current.nextindex+=1}// 没有查找到就返回-1return -1}LinkedList.prototype.update=function(position,newData){// position有效取值是[0,this.length-1]间的整数,修改失败返回falseif(position<0|| position>=this.length) return false;let current=this.headlet i=0// 遍历至处于position位置的节点while(i++<position){current=current.next}// console.log(i); //position=2时,i=3,说明跳出循环i还是会自增1,因为自增运算符比比较运算符优先级高// 跳出循环时,current已经指向处于position位置的节点current.data=newDatareturn true}LinkedList.prototype.removeAt=function(position){// 超出范围的删除不了if(position<0|| position>=this.length) return false;let current =this.head// 如果删除第一个节点if(position==0){// 在JS中,垃圾回收机制会清理未被指向的对象this.head=this.head.next}else{let i=0;let previous=this.headwhile(i++<position){previous=currentcurrent=current.next}// 在JS中,垃圾回收机制会清理未被指向的对象previous.next=current.next}this.length--;return current.data}LinkedList.prototype.remove=function(data){let current= this.headlet index=0let previous=this.head// 从头结点开始逐个查找数据等于data的节点while(current){if(current.data==data){// 如果删除的是头节点if(index==0){this.head=this.head.next}else{previous.next=current.next}this.length--;return index}// previous和current指向下一个节点previous=currentcurrent=current.nextindex+=1}// 没有查找到就返回falsereturn false}// 判断链表是否为空LinkedList.prototype.isEmpty=function(){return this.length==0}// 返回链表的长度LinkedList.prototype.size=function(){return this.length}}

链表节点实现
Java

// Definition for singly-linked list.
public class SinglyListNode {int val;SinglyListNode next;SinglyListNode(int x) { val = x; }
}

C++

// Definition for singly-linked list.
struct SinglyListNode {int val;SinglyListNode *next;SinglyListNode(int x) : val(x), next(NULL) {}
};

JS

//封装一个Node类,用于保存每个节点信息
function Node(element){this.element=elementthis.next=null
}

经典相关算法题

链表反转

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表
示例 1:
在这里插入图片描述
示例2
在这里插入图片描述
示例3
空链表反转后仍为空
题解

  1. 遍历节点,将每个节点的指向反转
/*** 定义单链表节点* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @return {ListNode}*/var reverseList = function(head) {// cur指向当前遍历的节点,pre指向前一个节点,let next=undefined,pre=null,cur=head;while(cur){// 顺序不能颠倒// next存储当前遍历节点的下一个结点的引用next=cur.next// 反转指向cur.next=pre// pre指向后移一位pre=cur;// cur指向后移一位cur=next}// 最终的pre成为新的头指针head=prereturn head
};

复杂度分析
时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。
空间复杂度:O(1)

  1. 递归
/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @return {ListNode}*/
var reverseList = function(head) {let pre=head,cur=head.next;// 考虑空链表和只有一个节点的情况if(pre==null || cur==null){head.next=nullreturn pre};cur.next=prereturn reverseList(cur)// 此时cur就相当于head
};

数组

  • 查找时间复杂度:O(1),因为可以直接根据索引查找
  • 插入或删除时间复杂度O(n),因为要移动删除或插入位置后面的数组元素

哈希表/散列表

用哈希函数确定键的存储位置
特点

  • 键不一样相应的存储位置也不一样
  • 键相同得到的存储位置相同
    在这里插入图片描述

因为所有树都可以转换成二叉树的形式,所以这里就只介绍二叉树数据结构的实现方式

完美二叉树(Perfect Binary Tree)/满二叉树(Full Binary Tree)

完全二叉树(Compelete Binary Tree)

二叉搜索树/二叉查找树/二叉排序树(Binary Search Tree,简称BST)

二叉搜索树构造函数实现如下

        function BinarySearchTree(){this.root=null// 节点构造函数function Node(key){this.key=keythis.left=nullthis.right=null}}

二叉搜索树的常见操作:
insert(key):向树中插入一个新的键;
search(key):在树中查找一个键,如果节点存在,则返回true;如果不存在,则返回false;
inOrderTraverse:通过中序遍历方式遍历所有节点;
preOrderTraverse:通过先序遍历方式遍历所有节点;
postOrderTraverse:通过后序遍历方式遍历所有节点;
min:返回树中最小的值/键;
max:返回树中最大的值/键;
remove(key):从树中移除某个键;

按照这个算法,在相同的顺序下最终所形成的二叉搜索树应该是一样的

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

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

相关文章

【STM32】STM32学习笔记-ADC单通道 ADC多通道(22)

00. 目录 文章目录 00. 目录01. ADC简介02. ADC相关API2.1 RCC_ADCCLKConfig2.2 ADC_RegularChannelConfig2.3 ADC_Init2.4 ADC_InitTypeDef2.5 ADC_Cmd2.6 ADC_ResetCalibration2.7 ADC_GetResetCalibrationStatus2.8 ADC_StartCalibration2.9 ADC_GetCalibrationStatus2.10 A…

197.【2023年华为OD机试真题(C卷)】执行时长(模拟题-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-执行时长二.解题思路三.题解代码Python题解代码…

前端接收后端传的文件流并下载解决乱码问题

因项目需求手写了一个导出&#xff0c;但是前端获取时出现了乱码&#xff0c;搜到一下解决方案&#xff1a; 两种情况&#xff1a; 1.如果这个接口是get的请求&#xff1a; 后端返回文件流&#xff0c;前端可能会导出txt或者excel的时候&#xff0c;里面的中文会出现乱码文章…

java 音乐会售票平台系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java 音乐会售票平台系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助struts2框架开发mvc模式&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发 环境为TOCAT7.0,Myeclipse8.5开发&#xff0c;数据…

【投稿优惠|优质会议】2024年材料化学与清洁能源国际学术会议(IACMCCE 2024)

【投稿优惠|优质会议】2024年材料化学与清洁能源国际学术会议(IACMCCE 2024) 2024 International Conference Environmental Engineering and Mechatronics Integration(ICEEMI 2024) 一、【会议简介】 随着全球能源需求的不断增长&#xff0c;清洁能源的研究与应用成为了国际…

三叠云流程制造ERP:构建智慧工厂,实现高效生产管理

在数字化经济的浪潮下&#xff0c;新一代信息技术快速发展&#xff0c;深度整合&#xff0c;引领了工业的创新和变革&#xff0c;推动了企业向智能化发展。解决生产管理、销售管理和技术管理等难题的关键&#xff0c;在于管理者能否及时准确地掌握企业运营信息。三叠云流程制造…

读书之深入理解ffmpeg_简单笔记2(初步)

再回看第一遍通读后的笔记&#xff0c;感觉还有很多的细节需要一一攻克,。 mp4的封装格式&#xff0c;解析方式。 flv的封装格式&#xff0c;解析方式。 ts的封装格式&#xff0c;解析方式。 第四章 封装和解封装 4.2 视频文件转flv &#xff08;头文件和文件内容&#xff0…

Django发送QQ邮件

创建一个表单&#xff0c;供用户填写他们的姓名和电子邮件、电子邮件收件人和可选的注释 创建blog/forms.py from django import formsclass EmailPostForm(forms.Form):name forms.CharField(max_length25)email forms.EmailField()to forms.EmailField()comments forms.…

【ARMv8架构系统安装PySide2】

ARMv8架构系统安装PySide2 Step1. 下载Qt资源包Step2. 配置和安装Qt5Step3. 检查Qt-5.15.2安装情况Step4. 安装PySide2所需的依赖库Step5. 下载和配置PySide2Step6. 检验PySide2是否安装成功 Step1. 下载Qt资源包 if you need the whole Qt5 (~900MB): wget http://master.qt…

密码学(一)

文章目录 前言一、Cryptographic Primitives二、Cryptographic Keys2.1 Symmetric key cryptography2.2 asymmetric key cryptography 三、Confidentiality3.1 Symmetric key encryption algorithms3.2 asymmetric key block ciphers3.3 其他 四、Integrity4.1 symmetric key s…

【C程序设计】C数组

C 语言支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量&#xff0c;比如 runoob0、runoob1、...、runoob99&#xff0c;而…

Python从入门到网络爬虫(文件I/O详解)

Python提供了强大而灵活的文件I/O&#xff08;输入/输出&#xff09;工具&#xff0c;能够读取、写入和处理各种文件类型。本文将深入介绍Python文件I/O的技巧和示例代码&#xff0c;帮助大家更好地理解如何在Python中处理文件。 打开文件 在Python中&#xff0c;可以使用open…

【安全篇 / FortiGuard】(7.4) ❀ 01. FortiGuard服务到期后会怎么样?❀ FortiGate 防火墙

【简介】很多企业为了网络的安全&#xff0c;都会购买FortiGuard服务&#xff0c;但是FortiGuard服务都是有期限的&#xff0c;由于各种原因&#xff0c;企业在超过服务期限后没有继续购买FortiGuard服务&#xff0c;那么会出现什么情况&#xff1f;防火墙还能继续工作吗&#…

61.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏红字公告功能的逆向分析

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一节内容&#xff1a;游戏公告功能的逆向分析与测试-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;63e04cc40f649d10ba2f4f…

【卡梅德生物】制备兔单抗常见问题及解决方法

在制备兔单抗的过程中&#xff0c;可能会遇到一些常见问题&#xff0c;以下是一些可能的问题和相应的解决方法&#xff1a; 1、低抗体产量&#xff1a; 问题原因&#xff1a;免疫兔子后&#xff0c;可能出现抗体产量较低的情况。 解决方法&#xff1a;提高抗原免疫方案、增加…

参加CTF比赛不会这些技术点,过去也是当炮灰!【CTF要掌握哪些技术点】

文章目录 0.前言1. Web技术2. 逆向工程3. 密码学4. 网络分析5. 系统编程6. 二进制分析7. 密码破解8. 隐写术9. 社会工程学10. 日志分析 0.前言 很多人学了很久网络安全方面的技术出来还是找不到工作&#xff0c;这到底是为什么&#xff1f;其实是没弄清楚现在企业在网络安全方…

伦茨科技Apple Find My认证芯片-ST17H6x芯片

深圳市伦茨科技有限公司&#xff08;以下简称“伦茨科技”&#xff09;发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家&#xff0c;该平台提供可通过Apple Find My认证的Apple查找&#xff08;Find My&#xff09;功能集成解决方案。…

Docker网络相关操作

文章目录 网络相关操作1 网络模式1.1 bridge模式1.2 host模式1.3 Container网络模式1.4 none模式1.5 overlay网络模式1.6 macvlan网络模式 2 bridge网络2.1 通过link的方式2.2 新建bridge网络 3 none网络4 host网络5 网络命令汇总5.1 查看网络5.2 创建网络5.3 删除网络5.4 查看…

(适趣AI)Vue笔试题

&#x1f4d1;前言 本文主要是【Vue】——&#xff08;适趣AI&#xff09;Vue笔试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

C++——类型转换

在文章的开始&#xff0c;先祝大家牢大年快乐 C语言中的类型转换 在C语言中&#xff0c;如果赋值运算两边类型不同&#xff0c;则会发生类型转换。一般来说&#xff0c;C语言有两种形式的类型转换&#xff1a;隐式转换和显式转换。 隐式转换&#xff0c;就是编译器自动根据其…