当前位置: 首页 > news >正文

【数据结构】优先级队列(堆)

文章目录

  • 💐1. 优先级队列
    • 1.1 概念
  • 💐2.堆的概念及存储方式
    • 2.1 什么是堆
    • 2.2 为什么要用完全二叉树描述堆呢?
    • 2.3 为什么说堆是在完全二叉树的基础上进行的调整?
    • 2.4 使用数组还原完全二叉树
  • 💐3. 堆的常用操作-模拟实现
    • 3.1 堆的创建
      • 3.1.1 堆的向下调整(大根堆为例)
      • 3.1.2 建堆的时间复杂度
    • 3.2 堆的插入和删除
      • 3.2.1 堆的插入
      • 3.2.2 堆的删除
  • 💐4. PriorityQueue常用接口及特性
      • PriorityQueue的构造
      • 优先级队列的扩容源码分析
  • 💐5. PriorityQueue的比较方式
  • 💐6. 例子:使用优先级队列解决TOP-k问题

💐1. 优先级队列

1.1 概念

队列是一种先进先出的数据结构,但是呢,有时候,数据之间也会有优先级,就比如说,我们想要拿到一个集合中的前k大的数据,或者是在平时,我们在打游戏时,这时候来电话了,但是,游戏也不能让他退出呀,这时候就会忽略掉电话,由此可见,游戏的优先级要比电话的优先级更高;

💐2.堆的概念及存储方式

优先级队列是由堆实现的而堆实际实际上是在完全二叉树的基础上进行了调整,而此时也就用到了 二叉树的顺序存储方式 这句话是什么意思呢?请看下图:

2.1 什么是堆

这里不做详细的介绍,只需知道,所有引用类型所创建的对象都保存在堆上,包括数组;而这里的堆是将所有的元素,按照完全二叉树的顺序存储方式存储到了一维数组中;

在这里插入图片描述

2.2 为什么要用完全二叉树描述堆呢?

在这里插入图片描述

2.3 为什么说堆是在完全二叉树的基础上进行的调整?

堆又分为了大根堆和小根堆

在这里插入图片描述

​ 从上图就可以发现两个性质:

1.大根堆中,所有的父节点都比子节点大

2.小根堆中,所有的父节点都比子节点小

2.4 使用数组还原完全二叉树

​ 在二叉树文章中,提到过这样一条性质:如果每一个节点都有一个编号 i 的话,那么:

1.当 i > 0 时,i 节点的父亲节点为: (i - 1) / 2;

2.如果 2i +1 < 节点的总数时,则下标为 i 节点的左孩子节点的下标为 2i + 1

3.如果 2i + 2 < 节点的总数时, 则下标为 i 的节点的左孩子节点的下标为 2i + 1

因为是在数组中进行存储的,所以完全二叉树中每一个节点的编号都是数组中每一个元素的下标;所以这样就可以使用数组来还原完全二叉树,然后再对完全二叉树进行调整;

在这里插入图片描述

在上一篇文章中,对于 优先级队列的概念及存储方式进行了一个详细的讲解,那么,本篇文章主要是针对优先级队列底层实现大致是什么样子的,亲手写一下代码结合图为大家讲解:

💐3. 堆的常用操作-模拟实现

3.1 堆的创建

我们知道,在上一篇文章中讲过,所有的元素都是在数组中存储的,那么,如何利用数组来实现 大根堆小根堆的创建呢?就要考虑下面这个问题:

如果出现子节点比父节点大或者小该怎么办呢,怎么去调整呢?

3.1.1 堆的向下调整(大根堆为例)

在这里插入图片描述

可以看出,最后一棵子树的子节点比父节点大,我们所用的方法就是:

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

代码实现:

public class MyPriorityQueue {//底层数组private int[] element;//数组中的元素private int usedSize;//初始默认容量private static final int default_capacity = 9;public MyPriorityQueue(int[] arr) {this.element = new int[default_capacity];//传入一个数组,对element进行构造for(int i = 0; i<arr.length; i++) {element[i] = arr[i];usedSize++;}}//建一个大根堆public void buildHeap() {//parent 求出最后一棵子树的父亲节点for(int parent = (usedSize-2)/2; parent >= 0; parent--) {/*为什么减2而不是减1呢?因为,如果是最后一个节点的下标值,就是减一,但是,数组的长度值比下标大1,所以减2*///向下调整shiftDown(parent, usedSize);}}private void shiftDown(int parent, int len) {//求左孩子节点int child = (2*parent)+1;//判断是否有右孩子节点并且判断左孩子节点是否大于右孩子节点if(child+1 < len && element[child] < element[child+1]){//得到最大的孩子节点child++;}//判断孩子节点是否比父亲节点大if(element[child] > element[parent]) {//进行交换swap(parent, child);}}private void swap(int parent, int child) {int tmp = element[parent];element[parent] = element[child];element[child] = tmp;}public static void main(String[] args) {//测试用例int[] ele = {50, 45, 40, 20, 25, 35, 30, 10, 60};MyPriorityQueue myPriorityQueue = new MyPriorityQueue(ele);myPriorityQueue.buildHeap();}

但是,上述代码存在一个致命的问题:

在这里插入图片描述

代码优化:

    private void shiftDown(int parent, int len) {//求左孩子节点int child = (2*parent)+1;while(child < len) {//判断是否有右孩子节点并且判断左孩子节点是否大于右孩子节点if(child+1 < len && element[child] < element[child+1]){//得到最大的孩子节点child++;}//判断孩子节点是否比父亲节点大if(element[child] > element[parent]) {//进行交换swap(parent, child);//保证交换后,该树的子树仍然是大根堆parent = child;child = (2*parent)+1;}else {//表示以该节点为根的树已经是大根堆了break;}}}

在这里插入图片描述

3.1.2 建堆的时间复杂度

在学会了建堆以后,接下来就聊一聊建堆所用的复杂度吧!先说结论,最坏的情况是O(n),下面我来推到以下:

在推导之前先说明一下:因为堆是完全二叉树,而满二叉树也是完全二叉树,多几个节点也无所谓,时间复杂度本来就是一个近似值,所以为了容易理解,这里会用满二叉树进行推导

在这里插入图片描述

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

3.2 堆的插入和删除

3.2.1 堆的插入

堆的插入分为两个步骤:

1.将要添加的元素放在底层数组的最后一个位置;注意是否要扩容问题

2.向上调整该元素

下面讲解一下什么是向上调整

直接拿要添加的元素与根节点相比较,因为,本身已经是大根堆了,直接与根节点比较,符合条件就交换,不需要再与其他的节点比较

在这里插入图片描述

代码实现:

    //插入方法public void offer(int val) {//判断是否需要扩容if(is_full()) {this.element = Arrays.copyOf(element, element.length+1);}//向上调整this.element[usedSize] = val;shiftUp();usedSize++;}//向上调整private void shiftUp() {int parent = (usedSize-1)/2;int child = usedSize;while(child > 0) {if(element[parent] < element[child]) {swap(parent, child);}child = parent;parent = (child-1)/2;}}private boolean is_full() {return usedSize == element.length;}

3.2.2 堆的删除

1.将第一个元素和最后一个元素进行交换

2.节点实际上并没有被删除,而是节点的个数useSize减1

3.最后向上调整

在这里插入图片描述

代码实现

    //删除public void poll() {//排除空堆情况if(usedSize == 0) {return;}//交换第一个和最后一个元素swap(0,usedSize-1);//节点个数减1,不会对最后一个元素进行判断usedSize--;for(int parent = (usedSize-1)/2; parent >= 0; parent--) {//向下调整shiftDown(parent, usedSize);}}private void shiftDown(int parent, int len) {//求左孩子节点int child = (2*parent)+1;while(child < len) {//判断是否有右孩子节点并且判断左孩子节点是否大于右孩子节点if(child+1 < len && element[child] < element[child+1]){//得到最大的孩子节点child++;}//判断孩子节点是否比父亲节点大if(element[child] > element[parent]) {//进行交换swap(parent, child);//保证交换后,该树的子树仍然是大根堆parent = child;child = (2*parent)+1;}else {//表示以该节点为根的树已经是大根堆了break;}}}

💐4. PriorityQueue常用接口及特性

Java的集合框架中提供了PriorityQueuePriorityBlockingQueue两种类型的优先级队列 ,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,本篇文章主要介绍PriorityQueue

PriorityQueue的构造

构造器功能讲解
PriorityQueue()创建一个空的优先级队列,默认容量是11
PriorityQueue(int initialCapacity)创建一个初始容量为intialCapacity的优先级队列,注意:initialCapacity不能小于1, 否则会抛出IllegalArgumentException异常
PriorityQueue(Collection<? extends E> c)用一个集合来创建优先级队列
PriorityQueue(Comparator<? super E> comparator)自定义类型进行比较,传入一个比较器

代码实现

   public static void main(String[] args) {//创建一个空的优先队列,底层默认容量是11PriorityQueue<Integer> priorityQueue1 = new PriorityQueue<>();//创建一个空的优先级队列,指定容量为100PriorityQueue<Integer> priorityQueue2 = new PriorityQueue<>(100);List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);//使用其他集合构造优先级队列PriorityQueue<Integer> priorityQueue3 = new PriorityQueue<>(list);//默认是小根堆,想要变成大根堆需要传入比较器PriorityQueue<Integer> priorityQueue4 = new PriorityQueue<>(new com());priorityQueue4.offer(1);priorityQueue4.offer(2);priorityQueue4.offer(3);}//定义一个比较器
class com implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}
}

PriorityQueue使用时需要注意:

1.使用时必须导入PriorityQueue所在的包,即:

import java.until.PriorityQueue;
  1. PriorityQueue中放置的元素必须要能够比较大小,不能插入不能比较大小的队象,否则会抛出ClassCastException异常
  2. 不能插入 null对象, 否则会抛出NullPointerException
  3. 没有容量限制,可以插入多个元素,其内部可以自动扩容
  4. 插入和删除元素的时间复杂度为O(log2N)
  5. PriorityQueue底层使用了堆数据结构
  6. PriorityQueue默认情况下是小根堆

Java中提供的方法:

函数功能介绍
boolean offer(E e)插入元素e, 插入成功返回true,如果e为空,抛出异常,空间不够时会进行扩容
E peek()获取优先级最高的元素,如果优先级队列为空,放回null
E pool()移除优先级最高的元素,如果优先级队列为空,返回null
int size()获取有效元素个数
void clear()清空
boolean isEmpty()检测优先级队列是否为空,如果为空返回true

优先级队列的扩容源码分析

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

💐5. PriorityQueue的比较方式

PriorityQueue底层使用堆结构,所以,内部的元素必须能够比较大小,PriorityQueue采用了:Comparble 和 Comjparator两种方式。

  1. Comparble默认的内部比较方式,如果用户插入自定义类型对象是,该类对象必须要实现Comparble接口,并且要重写compareTo方法

  2. 也可以使用比较器,用户自己实现一个比较器类且实现Comaparator接口,并且让该类重写compare方法,指定根据对象的什么内容进行比较,然后再实例化PriorityQueue对象时,把比较器传进去;

源码讲解:

	//内部定义的比较器对象private final Comparator<? super E> comparator;//如果用户没有提供比较器,则使用内部的比较方式,将comparator置为nullpublic PriorityQueue() {this(DEFAULT_INITIAL_CAPACITY, null);}//如果用户提供了比较器,则采用提供的比较器进行比较public PriorityQueue(int initialCapacity,Comparator<? super E> comparator) {// Note: This restriction of at least one is not actually needed,// but continues for 1.5 compatibilityif (initialCapacity < 1)throw new IllegalArgumentException();this.queue = new Object[initialCapacity];this.comparator = comparator;}//在添加对象时进行向上调整//如果没有提供比较器,则采用内部比较方式,即Comparable//如果提供了比较器,则采用比较器进行比较private void siftUp(int k, E x) {if (comparator != null)siftUpUsingComparator(k, x);elsesiftUpComparable(k, x);}//采用comparable进行比较private void siftUpComparable(int k, E x) {Comparable<? super E> key = (Comparable<? super E>) x;while (k > 0) {int parent = (k - 1) >>> 1;Object e = queue[parent];if (key.compareTo((E) e) >= 0)break;queue[k] = e;k = parent;}queue[k] = key;}//采用comparator进行比较private void siftUpUsingComparator(int k, E x) {while (k > 0) {int parent = (k - 1) >>> 1;Object e = queue[parent];if (comparator.compare(x, (E) e) >= 0)break;queue[k] = e;k = parent;}queue[k] = x;}

在这里插入图片描述

在这里插入图片描述

💐6. 例子:使用优先级队列解决TOP-k问题

TOP-K 问题:求数据集合中前K个最大的元素或者最小的元素,一般数据量都比较大;

[面试题 17.14. 最小K个数 - 力扣(LeetCode)]()

class Solution {public int[] smallestK(int[] arr, int k) {//创建一个优先级队列PriorityQueue<Integer> heap = new PriorityQueue<>();//将所有元素加入到队列中for(int i = 0; i<arr.length; i++) {heap.add(arr[i]);}//创建一个数组用来存储前k个元素int[] ans = new int[k];//将堆中的前k个元素保存在数组中for(int i = 0; i<k; i++) {ans[i] = heap.poll();}//返回数组return ans;}
}

但是,上面这个代码只能针对于数据量较小时才行,如果数据量太大就会造成时间复杂度过高,比如,有一亿个数据,如果使用以上代码的话,会先将一亿个数据都保存在堆中,然后进行比较,这就得不偿失了;那么就要对代码进行一个优化:

1.用集合中的前k个元素建堆;

  • 前k大个元素建小堆
  • 前k小个元素建大堆

2.用剩余的n(元素的个数) - k个元素与堆中的元素进行比较;最后堆中剩余的元素就是前k个最大或最小的元素

代码实现:

    public int[] smallestK(int[] arr, int k) {//求前k个最小元素,所以要建大根堆,因为PriorityQueue默认的是小根堆,所以要传入比较器PriorityQueue<Integer> heap = new PriorityQueue<>(new Com());//将前k个元素加入到堆中for(int i = 0; i<k; i++){heap.add(arr[i]);}if(heap.isEmpty()) {return new int[]{};}//用剩余的元素与堆顶元素比较for(int i = k; i<arr.length; i++) {int x = heap.peek();//这里的条件语句求的是前k个最小元素if(arr[i] < x){heap.poll();heap.offer(arr[i]);}}int[] ans = new int[k];for(int i = 0; i<k; i++){ans[i] = heap.poll();}return ans;}
}
//自定义一个比较器
class Com implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}
}

相关文章:

【数据结构】优先级队列(堆)

文章目录 &#x1f490;1. 优先级队列1.1 概念 &#x1f490;2.堆的概念及存储方式2.1 什么是堆2.2 为什么要用完全二叉树描述堆呢&#xff1f;2.3 为什么说堆是在完全二叉树的基础上进行的调整&#xff1f;2.4 使用数组还原完全二叉树 &#x1f490;3. 堆的常用操作-模拟实现3…...

前端笔试2

1.下面哪一个是检验对象是否有一个以自身定义的属性? foo.hasOwnProperty("bar")bar in foo foo["bar"] ! undefinedfoo.bar ! null 解析&#xff1a; bar in foo 检查 foo 对象是否包含名为 bar 的属性&#xff0c;但是这个属性可以是从原型链继承来的&a…...

LeetCode:66.加一

66.加一 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/plus-one/description/ 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数…...

Redis 常用命令

目录 全局命令 1&#xff09;keys 2&#xff09;exists 3) del(delete) 4&#xff09;expire 5&#xff09;type SET命令 GET命令 MSET 和 MGET命令 其他SET命令 计数命令 redis-cli&#xff0c;进入redis 最核心的命令&#xff1a;我们这里只是先介绍 set 和 get 最简单的操作…...

Integer.valueOf()用于字符和字符串的区别

LeetCode 17 电话号码的字母组合 先贴代码 class Solution {List<String> result new ArrayList<>();String temp new String("");Integer num;public List<String> letterCombinations(String digits) {dfs(digits, 0);return result;} publi…...

机械寿命预测(基于NASA C-MAPSS数据的剩余使用寿命RUL预测,Python代码,CNN_LSTM模型,有详细中文注释)

1.效果视频&#xff1a;机械寿命预测&#xff08;NASA涡轮风扇发动机剩余使用寿命RUL预测&#xff0c;Python代码&#xff0c;CNN_LSTM模型&#xff0c;有详细中文注释&#xff09;_哔哩哔哩_bilibili 环境库版本&#xff1a; 2.数据来源&#xff1a;https://www.nasa.gov/int…...

ConfigMaps-1

文章目录 主要内容一.使用 YAML 文件创建1.在data节点创建了一些键值&#xff1a;代码如下&#xff08;示例&#xff09;: 2.解释 二.使用命令行创建1.创建了一个名为 person 的键值&#xff1a;代码如下&#xff08;示例&#xff09;: 2.解释3.创建了一个 index.html 文件&…...

docker上安装es

安装docker 1 安装docker依赖 yum install -y yum-utils2 设置docker仓库镜像地址 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3 安装制定版本的docker yum -y install docker-ce-20.10.17-3.el74 查看是否安装成功 y…...

#循循渐进学51单片机#c语言基础和流水灯实现#not.3

1、熟练掌握二进制、十进制和十六进制的转换方法。 多少进制就是多少之间相加&#xff0c;比如十六进制就是十六一次一加&#xff1b;二进制转化十六进制&#xff0c;分成四个一组。 2、C语言变量类型与取值范围&#xff0c;for、while等基本语句的用法。 for、while等基本语句…...

算法刷题 week3

这里写目录标题 1.重建二叉树题目题解(递归) O(n) 2.二叉树的下一个节点题目题解(模拟) O(h) 3.用两个栈实现队列题目题解(栈&#xff0c;队列) O(n) 1.重建二叉树 题目 题解 (递归) O(n) 递归建立整棵二叉树&#xff1a;先递归创建左右子树&#xff0c;然后创建根节点&…...

TCP详解之流量控制

TCP详解之流量控制 发送方不能无脑的发数据给接收方&#xff0c;要考虑接收方处理能力。 如果一直无脑的发数据给对方&#xff0c;但对方处理不过来&#xff0c;那么就会导致触发重发机制&#xff0c;从而导致网络流量的无端的浪费。 为了解决这种现象发生&#xff0c;TCP 提…...

mac根目录下创建文件不能问题

mac根目录下创建文件不能问题 解决办法2: 原因 mac os引入了系统完整性保护&#xff08;SIP&#xff09;机制&#xff0c;无法在/、/usr目录下新建文件 解决办法1&#xff1a; 打开终端&#xff0c;输入 csrutil status显示enabled表示启用了SIP&#xff0c;接下来需要禁用SIP…...

stable diffusion model训练遇到的问题【No module named ‘triton‘】

一天早晨过来&#xff0c;发现昨天还能跑的diffusion代码&#xff0c;突然出现了【No module named ‘triton’】的问题&#xff0c;导致本就不富裕的显存和优化速度雪上加霜&#xff0c;因此好好探究了解决方案。 首先是原因&#xff0c;由于早晨过来发现【电脑重启】导致了【…...

线性dp,优化记录,273. 分级

273. 分级 273. 分级 - AcWing题库 给定长度为 N 的序列 A&#xff0c;构造一个长度为 N 的序列 B&#xff0c;满足&#xff1a; B 非严格单调&#xff0c;即 B1≤B2≤…≤BN 或 B1≥B2≥…≥BN。最小化 S∑Ni1|Ai−Bi|。 只需要求出这个最小值 S。 输入格式 第一行包含一…...

JWT 安全及案例实战

文章目录 一、JWT (json web token)安全1. Cookie&#xff08;放在浏览器&#xff09;2. Session&#xff08;放在服务器&#xff09;3. Token4. JWT (json web token)4.1 头部4.1.1 alg4.1.2 typ 4.2 payload4.3 签名4.4 通信流程 5. 防御措施 二、漏洞实例&#xff08;webgoa…...

Vue2+Vue3

文章目录 Vue快速上手Vue是什么第一个Vue程序插值表达式Vue核心特性&#xff1a;响应式 Vue指令v-htmlv-show 与 v-ifv-else 与 v-else-ifv-onv-bindv-forv-model指令修饰符 计算属性watch侦听器&#xff08;监视器&#xff09;watch——简写watch——完整写法 Vue生命周期 和 …...

华为云云耀云服务器L实例评测|redis漏洞回顾 MySQL数据安全解决 搭建主从集群MySQL 相关设置

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到过MySQL数据库被攻击的情况&#xff0c;数据丢失&#xff0c;还好我有几份备份&#xff0c;没有造成太大的损失&#xff1b;后来有发现Redis数据库被攻击的情况&#xff0c;加入了redis密…...

【C++】详解std::thread

2023年9月10日&#xff0c;周日下午开始 2023年9月10日&#xff0c;周日晚上23:35完成 虽然这篇博客我今天花了很多时间去写&#xff0c;但是我对std::thread有了一个完整的认识 不过有些内容还没完善&#xff0c;以后有空再更新.... 目录 头文件类的成员类型方法(construc…...

Apache HTTPD 漏洞复现

文章目录 Apache HTTPD 漏洞复现1. Apache HTTPD 多后缀解析漏洞1.1 漏洞描述1.2 漏洞复现1.3 漏洞利用1.4 获取GetShell1.5 漏洞防御 2. Apache HTTPD 换行解析漏洞-CVE-2017-157152.1 漏洞描述2.2 漏洞复现2.3 漏洞利用2.4 修复建议 3. Apache HTTP Server_2.4.49 路径遍历和…...

【C++从入门到精通】第2篇:C++基础知识(中)

文章目录 2.1 iostream介绍&#xff1a;cout、cin和endl2.1.1 输入/输出库2.1.2 std::cout2.1.3 std::endl2.1.4 std::cout是缓冲的2.1.5 std::endl与\n2.1.6 std::cin2.1.7 总结2.1.8 练习时间 2.2 未初始化的变量和未定义的行为2.2.1 未初始化的变量2.2.2 未定义行为2.2.3 明…...

【RuoYi移动端】uni-app中实现生成二维码功能(代码示例)

完整示例&#xff1a; <template><view><view class"titleBar">执法检查“通行码”信息</view><view class"twoCode"><canvas canvas-id"qrcode"></canvas></view></view> </templat…...

深度解剖数据在栈中的应用

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1…...

Android10 SystemUI系列 需求定制(一)状态栏控制中心默认tile定制属性适配

一、前言 SystemUI 所包含的界面和模块比较多,这一节主要分享一下控制中心默认tile 列表的实现,通过配置可以实现 下拉状态栏,控制中心默认的tile显示 二、准备工作 按照惯例先找一下控制中心的代码,主要在下面这个路径下 frameworks/base/packages/SystemUI/src/com/andr…...

【微信小程序】文章设置

设置基本字体样式&#xff1a;行高、首行缩进 font-size: 32rpx;line-height: 1.6em;text-indent: 2em;padding: 20rpx 0;border-bottom: 1px dashed var(--themColor); 两端对齐 text-align: justify; css文字两行或者几行显示省略号 css文字两行或者几行显示省略号_css…...

程序员在线周刊(冒泡算法篇)

大家好&#xff0c;欢迎来到程序员在线周刊&#xff01;本期我们将深入探讨一种经典的排序算法——冒泡算法&#xff0c;并附上具体的代码实现。 目录 简介代码原理广告广告1广告2广告3 简介 冒泡算法是一种简单但效率较低的排序算法&#xff0c;它的原理非常直观&#xff1a…...

string

目录 六、STL简介 (一)什么是STL (二)STL的版本 (三)STL六大组件 七、string (一)标准库中的string 1、string类 2、string常用的接口 1)string类对象的常见构造 2)string类对象的容量操作 3)string类对象的访问及遍历操作 4)string类对象的修改操作 5)string类非成…...

html的日期选择插件

1.效果 2.文档 https://layui.gitee.io/v2/docs/ 3.引入 官网地址&#xff1a; https://layui.gitee.io/v2/ 引入&#xff08;在官网下载&#xff0c;&#xff09;jquery-1.7.2.min.js,layui/layui.js **<link href"js/layui/css/layui.css" rel"stylesh…...

OPPO哲库事件 “ 始末 ” ! 集体打哑谜?

1►OPPO哲库解散 2019 年&#xff0c;美国商务部以“科技网络安全”为由&#xff0c;将华为公司及其70家附属公司列入出口管制“实体名单”。与此同时&#xff0c;OPPO 创始人兼 CEO陈明永对外宣布&#xff0c;公司将为未来三年内投入 500 亿元用于前沿技术和深水区技术的探索…...

数据聚类分析

K均值 1.1 数据来源(随机生成) import matplotlib.pyplot as plt from sklearn.datasets import make_blobsX, y make_blobs(n_samples150,n_features2,centers3,cluster_std0.5,shuffleTrue,random_state0) # plt.scatter(X[:, 0], X[:, 1], cwhite, markero, edgecolorsbl…...

前 40 个 Microsoft Excel 面试问题答案

1&#xff09;什么是 Microsoft Excel&#xff1f; Microsoft Excel 是一个电子电子表格应用程序&#xff0c;使用户可以使用按行和列细分的电子表格系统&#xff0c;使用公式存储&#xff0c;组织&#xff0c;计算和处理数据。 它还提供了使用外部数据库进行分析&#xff0c;…...

东莞网站建设制作厂/seo优化推广

目录 一、目的--设计原则解决的问题 二、设计原则 2.1 原则概念 2.2 开闭原则 2.3 迪米特法则 2.4 合成复用原则 2.5 依赖倒置原则 一、目的--设计原则解决的问题 支持可维护性的同时&#xff0c;提高系统的可复用性&#xff0c;达到高内聚&#xff0c;低耦合目的。 二…...

yfcms企业网站建设/新站seo竞价

原作者&#xff1a;王健 来源&#xff1a;https://insights.thoughtworks.cn/what-is-zhongtai/ 从去年开始&#xff0c;好像就有一只无形的手一直将我与“微服务”、“平台化”、“中台化”撮合在一起&#xff0c;给我带来了很多的困扰和思考与收获。 故事的开始源于去年的技术…...

可以做外链的网站/南京百度推广

1&#xff1a;场景一&#xff1a;工厂模式中简单工厂模式优化 1&#xff09;简单工厂模式也可以叫做静态方法模式&#xff08;因为工厂类一般都是在内部定义了一个静态方法&#xff09; 2&#xff09;简单工厂模式通过创建一个对应的工厂类&#xff0c;将类实例化的操作与使用…...

怎么看一个网站是用什么程序做的/厦门关键词优化平台

第2章 Java应用程序介绍2.1 作业检查单2.2 实验前任务2.3 实验练习2.4 实验后任务第3章 Java applet 介绍3.1 作业检查单3.2 实验前任务3.3 实验练习3.4 实验后任务第4章 控制结构(一)4.1 作业检查单4.2 实验前任务4.3 实验练习4.4 实验后任务第2章 Java应用程序介绍2.1 作业检…...

angular 做网站/专业提升关键词排名工具

1. 题目 参考链接: 检测循环依赖 现有n个编译项&#xff0c;编号为0 ~ n-1。给定一个二维数组&#xff0c;表示编译项之间有依赖关系。如[0, 1]表示1依赖于0。 若存在循环依赖则返回空&#xff1b;不存在依赖则返回可行的编译顺序。 2. 题解 若给定一个依赖关系是[[0,2],[…...

湖南做网站 x磐石网络/a站

原文&#xff1a;https://blog.csdn.net/qq_27198345/article/details/111401610对于管理系统或其他需要用户登录的系统&#xff0c;登录验证都是必不可少的环节&#xff0c;在SpringBoot开发的项目中&#xff0c;通过实现拦截器来实现用户登录拦截并验证。1、Spring Boot实现登…...