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

【优选算法---归并排序衍生题目】剑指offer51---数组中的逆序对、计算右侧小于当前元素的个数、翻转对

一、剑指offer51---数组中的逆序对

题目链接:

LCR 170. 交易逆序对的总数 - 力扣(LeetCode)

题目介绍:

在数组中的两个数字,如果前面⼀个数字大于后面的数字,则这两个数字组成⼀个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

示例1:

  • 输入:[7,5,6,4]
  • 输出: 5

0 <= record.length <= 50000

思路:

        首先暴力解法就是先确定一个元素,然后遍历数组,找有多少个比他小的数,就是简单的两个循环,但是暴力解法是一定会超时的。

        接下来讲解一下更高效的方法。要求一个区间的所有的逆序对,我们可以将数组分为两部分,那结果就是 左部分的所有的逆序对 + 右部分的逆序对 + 一左一右选择的逆序对 ,会发现这个过程非常像归并排序的过程,所以们就往这个思路上想。

        如果单纯的按上面的步骤写,其实还是暴力的解法,但是如果我们在找到逆序逆序对后数组顺便排下序,这样找逆序对就会很快,排序并不会改变逆序对的个数,可以找一个例子验证一下。

最核心的问题,如何在合并两个有序数组的过程中,统计出逆序对的数量?

         合并两个有序序列时求逆序对的方法有两种:

  1. 在右边选一个数,看左边哪个比他大
  2. 在左边选一个数,看右边哪个比他小

方式1:在右边选一个数,看左边哪个比他小

  • 假设我们排的是升序:

假设此时如果 nums[begin1] <= nums[begin2] ,由于当前是升序,往后遍历也不会有元素比nums[begin1] 小,所以可以让begin1++,如果 nums[begin1] > nums[begin2] 的话,由于是升序的,所以从begin1 到 mid 之间的元素都大于nums[begin2] ,都符合逆序对,此时左部分可以与nums[begin2]组成逆序对的个数都统计出来了,就可以让begin2++,按照这个思路这个题目的事件复杂度和归并排序是一样的。

  • 那按照降序行不行呢?

我们来模拟一下,假设此时如果 nums[begin1] > nums[begin2] ,由于数组是降序那从begin到begin1之间的元素都大于nums[begin2] ,都可以与他构成逆序对,但是此时可以与nums[begin2]g构成逆序对的元素还没找完,因为不能确定begin1后面的元素是否还大于nums[begin2]。所以只能让begin1++,如果对应的这个元素仍然大于nums[begin2],我们就要继续计算begin 到 begin1 之间的元素,这样就会有重复的数据,所以方式一只能按升序处理

class Solution {int tmp[50010];
public:int reversePairs(vector<int>& record) {return MergeSort(record,0,record.size()-1);}int MergeSort(vector<int>& record,int begin,int end){if(begin>=end) return 0;int mid=(begin+end)/2;int ret=0;ret+=MergeSort(record,begin,mid);ret+=MergeSort(record,mid+1,end);//处理一左一右int begin1=begin,end1=mid;int begin2=mid+1,end2=end;int j=0;while(begin1<=end1&&begin2<=end2){if(record[begin1]<=record[begin2]){//处理排序,顺便让begin1向后遍历tmp[j++]=record[begin1++];}else{ret+=(mid-begin1+1);tmp[j++]=record[begin2++];}}while(begin1<=end1)  tmp[j++]=record[begin1++];while(begin2<=end2)  tmp[j++]=record[begin2++];for(int i=begin;i<=end;i++)record[i]=tmp[i-begin];return ret;}
};

方式2:在左边选一个数,看右边哪个比他小

  • 假设我们排的是升序:

假设此时nums[begin1]>nums[bgein2],此时右边 mid+1 到 begin2 之间的数都小于nums[begin1],就可以统计结果, begin2++后,仍然有可能 nums[begin1]>nums[bgein2] ,此时统计的结果就存在重复,所以方式2只能采用降序的方式

  • 假设是降序

       

假设  nums[begin1]<=nums[bgein2] ,begin2就需要++,如果nums[begin1]>nums[bgein2] 的话,说明右边 begin2 到end之间的元素都小于nums[begin1],此时右边可以与nums[begin1]构成逆序对的数都统计出来了,begin1就可以++

 

class Solution {int tmp[50010];
public:int reversePairs(vector<int>& record) {return MergeSort(record,0,record.size()-1);}int MergeSort(vector<int>& record,int begin,int end){if(begin>=end) return 0;int mid=(begin+end)/2;int ret=0;ret+=MergeSort(record,begin,mid);ret+=MergeSort(record,mid+1,end);//处理一左一右int begin1=begin,end1=mid;int begin2=mid+1,end2=end;int j=0;while(begin1<=end1&&begin2<=end2){if(record[begin1]<=record[begin2]){tmp[j++]=record[begin2++];}else{ret+=(end-begin2+1);tmp[j++]=record[begin1++];}}while(begin1<=end1)  tmp[j++]=record[begin1++];while(begin2<=end2)  tmp[j++]=record[begin2++];for(int i=begin;i<=end;i++)record[i]=tmp[i-begin];return ret;}
};

二、计算右侧小于当前元素的个数

题目链接:

315. 计算右侧小于当前元素的个数 - 力扣(LeetCode)

题目介绍:

给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于 nums[i] 的元素的数量。

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104
思路:

这个题目的思路完全和上一个题目一样,不同的地方是这个题要我们返回一个数组,数组的元素代表nums对应那个元素的逆序对个数,我们上面的思路实在归并排序的过程中计算出逆序对的,但是由于要排序,数组元素的对应位置也会改变,所以我们需要解决这个问题即可。

通过元素的值构建哈希表这个方案是不能用的,因为数组可能会有重复的元素,但是我们还是要利用哈希的原理,我们可以创建一个数组index,让这个数组映射nums每个元素的下标,在对nums排序时,连带index数组一起排序,这样映射关系就建立好了。

所以我们一共需要创建两个辅助数组,tmpNums、tmpIndex,一个用来辅助Nums排序,一个用来辅助index数组排序

class Solution {
public:int tmpNums[500010];int tmpIndex[500010];vector<int> ret;vector<int> index;vector<int> countSmaller(vector<int>& nums) {int n = nums.size();ret.resize(n);index.resize(n);// 构建映射for (int i = 0; i < n; i++) {index[i] = i;}MergeSort(nums, 0, n - 1);return ret;}void MergeSort(vector<int>& nums,int begin,int end){if(begin>=end)return;int mid=(begin+end)/2;MergeSort(nums,begin,mid);MergeSort(nums,mid+1,end);int begin1=begin,end1=mid;int begin2=mid+1,end2=end;int j=0;while(begin1<=end1&&begin2<=end2){if(nums[begin1]<=nums[begin2]){tmpNums[j]=nums[begin2];tmpIndex[j++]=index[begin2++];}else{ret[index[begin1]]+=(end2-begin2+1);tmpNums[j]=nums[begin1];tmpIndex[j++]=index[begin1++];}}while(begin1<=end1){tmpNums[j]=nums[begin1];tmpIndex[j++]=index[begin1++];}while(begin2<=end2){tmpNums[j]=nums[begin2];tmpIndex[j++]=index[begin2++];}for (int i = begin; i <= end; i++) {nums[i] = tmpNums[i - begin];index[i] = tmpIndex[i - begin];}}
};

 三、翻转对

题目链接:

493. 翻转对 - 力扣(LeetCode)

题目介绍:

给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对

你需要返回给定数组中的重要翻转对的数量。

  • 给定数组的长度不会超过50000
  • 输入数组中的所有数字都在32位整数的表示范围内。
思路:

这个题目的思路与逆序对那个题目几乎一样,不同的是逆序对那个题找的是nums[i]>nums[j],与归并排序的判断一致,所以就一边合并一边计算了,但是这个题的判断是大于2倍,与归并排序的判断条件并不符合,如果硬要边和并边计算从理论上说是可以的,但是这样会增加程序的复杂度,所以我们需要在归并前,利用两边是有序的特性,计算出翻转对的个数。

假设我们是降序的,如果nuns[begin1] <= nums[begin2] *2的话,就让cur2++,如果

nuns[begin1] > nums[begin2]*2 的话,由于是降序,begin2到end之间的元素也是符合要求的,此时让begin1++,继续判断,这样指针没有回退,求翻转对的时间复杂度就是O(N)

class Solution {int tmp[50010];
public:int reversePairs(vector<int>& nums) {return MergeSort(nums,0,nums.size()-1);}int MergeSort(vector<int>& nums,int begin,int end){if(begin>=end) return 0;int mid=(begin+end)/2;int ret=0;ret+=MergeSort(nums,begin,mid);ret+=MergeSort(nums,mid+1,end);//处理翻转对int begin1=begin,end1=mid;int begin2=mid+1,end2=end;while(begin1<=end1){while(begin2<=end2&&nums[begin2]>=nums[begin1]/2.0)begin2++;if(begin2>end2)break;ret+=end-begin2+1;begin1++;}//处理一左一右begin1=begin,end1=mid;begin2=mid+1,end2=end;int j=0;while(begin1<=end1&&begin2<=end2){if(nums[begin1]<=nums[begin2]){tmp[j++]=nums[begin2++];}else{tmp[j++]=nums[begin1++];}}while(begin1<=end1)  tmp[j++]=nums[begin1++];while(begin2<=end2)  tmp[j++]=nums[begin2++];for(int i=begin;i<=end;i++)nums[i]=tmp[i-begin];return ret;}
};

相关文章:

【优选算法---归并排序衍生题目】剑指offer51---数组中的逆序对、计算右侧小于当前元素的个数、翻转对

一、剑指offer51---数组中的逆序对 题目链接: LCR 170. 交易逆序对的总数 - 力扣&#xff08;LeetCode&#xff09; 题目介绍&#xff1a; 在数组中的两个数字&#xff0c;如果前面⼀个数字大于后面的数字&#xff0c;则这两个数字组成⼀个逆序对。输入一个数组&#xff0c…...

单体到微服务:电商平台架构的演变与可扩展性探索

目录 一、整体理解可扩展性 二、从电商平台架构发展看架构的可扩展性 &#xff08;一&#xff09;单体架构 &#xff08;二&#xff09;分布式架构 &#xff08;三&#xff09;SOA架构 &#xff08;四&#xff09;微服务架构 三、1号店App服务端架构升级说明 &#xff…...

clickhouse-副本和分片

1、副本 1.1、概述 集群是副本和分片的基础&#xff0c;它将ClickHouse的服务拓扑由单节点延伸到多个节点&#xff0c;但它并不像Hadoop生态的某些系统那样&#xff0c;要求所有节点组成一个单一的大集群。ClickHouse的集群配置非常灵活&#xff0c;用户既可以将所有节点组成…...

C语言版解法力扣题:将整数按权重排序

1.题目描述 我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数&#xff1a; 如果 x 是偶数&#xff0c;那么 x x / 2 如果 x 是奇数&#xff0c;那么 x 3 * x 1 比方说&#xff0c;x3 的权重为 7 。因为 3 需要 7 步变成 1 &#xff08;3 --> 10 -->…...

ubuntu18.04升级到ubuntu20.04

为了使用qt6&#xff0c;在ubuntu18.04上各种折腾失败&#xff0c;无奈只能升级到ubuntu20.04, 按照网上的教程没成功。自己摸索了 lsb_release -a df -h sudo apt update sudo apt upgrade -y sudo apt dist-upgrade -y sudo apt autoremove -y sudo apt clean sudo apt inst…...

【我的 PWN 学习手札】IO_FILE 之 stdin任意地址写

我们知道&#xff0c;stdin会往“缓冲区”先读入数据&#xff0c;如果我们劫持这个所谓“缓冲区”到其他地址呢&#xff1f;是否可以读入数据到任意地址&#xff1f;答案是肯定的。 注意&#xff01;代码中的“-------”分隔&#xff0c;是为了区分一条调用链上不同代码片段&am…...

<mutex>注释 11:重新思考与猜测、补充锁的睡眠与唤醒机制,结合 linux0.11 操作系统代码的辅助(上)

&#xff08;46&#xff09;问题的起源&#xff1a; 因为上面的内核代码&#xff0c;我们编写多线程代码时&#xff0c;对手里的家伙事不那么自信。但我们知道&#xff0c;多线程在竞争锁时&#xff0c;若得不到锁&#xff0c;会进入睡眠&#xff0c;并会在被唤醒后重新尝试得…...

C/C++圣诞树

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C…...

upload-labs-master第21关超详细教程

目录 环境配置解题思路利用漏洞 操作演示 环境配置 需要的东西 phpstudy-2018 链接&#xff1a; phpstudy-2018 提取码&#xff1a;0278 32 位 vc 9 和 11 运行库 链接&#xff1a; 运行库 提取码&#xff1a;0278 upload-labs-master 靶场 链接&#xff1a; upload-lasb-ma…...

Python基础——数学运算

目录 1. 算术运算符 2. 比较运算符 3. 赋值运算符 4. 逻辑运算符 5. 成员运算符 6. 身份运算符 7. 三目运算符 Python数学计算通过多种运算符来执行&#xff0c;常用的运算符类型包括算术运算符、比较运算符、赋值运算符、逻辑运算符、成员运算符、身份运算符、三目…...

ubuntu 安装更新 ollama新版本

ubuntu 安装更新 ollama新版本 我这里是 2024-12-18 ollama 版本是 0.5.3 1手动下载 ollama-linux-amd64.tgz https://github.com/ollama/ollama/releases 2下载脚本 https://ollama.com/install.sh install.sh 和 ollama-linux-amd64.tgz 在相同路径下 修改&#xff1a;…...

汽车IVI中控开发入门及进阶(45):凌阳科技车载娱乐芯片

概述: Sunplus科技有限公司成立于1990年,是一家领先的多媒体和汽车应用芯片提供商,如DVD播放器、便携式DVD播放器、家庭娱乐音频产品、汽车信息娱乐和高级驾驶辅助系统(ADAS)。与此同时,凌阳正在为消费类、便携式和连接设备上的广泛应用提供高速I/O IP、高性能数据转换I…...

Linux export命令

本文来自智谱清言 --------- 在Linux系统中&#xff0c;export 是一个用来设置环境变量的命令。 环境变量是操作系统运行时用于存储有关系统环境的信息的变量&#xff0c;它们对于用户和程序都是可访问的。下面是关于 export 命令的一些基本用法&#xff1a; 基本语法 ba…...

AI自我进化的新篇章:谷歌DeepMind推出苏格拉底式学习,语言游戏解锁无限潜能

各位AI爱好者、技术研究者&#xff0c;大家好&#xff01;今天我们来聊聊一个令人兴奋的AI研究新进展——谷歌DeepMind推出的“苏格拉底式学习”方法。这项研究的独特之处在于&#xff0c;它让AI在没有外部数据的情况下&#xff0c;通过“语言游戏”实现自我进化&#xff0c;这…...

【BUG】记一次context canceled的报错

文章目录 案例分析gorm源码解读gin context 生命周期context什么时候cancel的什么时候context会被动cancel掉呢&#xff1f; 野生协程如何处理 案例分析 报错信息 {"L":"ERROR","T":"2024-12-17T11:11:33.0050800","file"…...

JAVA前端开发中type=“danger“和 type=“text“的区别

在前端开发中&#xff0c;type 属性通常用于指定按钮或其他元素的样式或行为。不同的框架和库可能对 type 属性有不同的定义和用法。常见的框架包括 Bootstrap、Ant Design&#xff08;antd&#xff09;、Element Plus 等。下面我将分别介绍在这些框架中 type"danger"…...

sqlite3 支持位运算 和view和 triger

数据设置条件以后可以.根据门限自动调整其他的值 由数据库记录修改时间,及记录-> 网元设备的告警产生时间,设置超时清除时间,记录系统的原始时间戳 CPp 有 sqlite 支持 json 导出字符串,json 库将字符串,映射为结构体 triger update table 更新到一个 可设置参数列表 ,view …...

Mysql复习(一)

数据库系统的核心是&#xff08; 数据库管理系统 &#xff09;。 以下的标识符中符合标识符命名规则的有几个?&#xff08;3个&#xff09; 3abc7, abc73, bc73a, c73ab,*73abc 标识符的第一个字符允许包括哪些符号?&#xff08; _ 或者 或者 #&#xff09; 关系表达式运算的…...

Redis bitmaps 使用

应用场景&#xff1a; 记录id为 1 的用户&#xff0c;2024年12月签到情况&#xff0c;并统计&#xff1b; 记录 1号签到 zxys-redis:0>setbit 1:202412 1 1 记录 2号签到 zxys-redis:0>setbit 1:202412 2 1 记录 3号未签到 zxys-redis:0>setbit 1:202412 3 0 …...

计算无人机俯拍图像的地面采样距离(GSD)矩阵

引言 在无人机遥感、测绘和精细农业等领域&#xff0c;地面采样距离&#xff08;Ground Sampling Distance&#xff0c;简称 GSD&#xff09;是一个非常重要的指标。GSD 是指图像中每个像素在地面上实际代表的物理距离&#xff0c;通常以米或厘米为单位。GSD 决定了图像的空间…...

Java基础 | 数据库的命名规范

数据库的命名规范 1. 基本原则2. 命名规范详解2.1 命名禁止项2.2 命名规范3. 通用字段规范4. 特殊表命名建议 1. 基本原则 统一性&#xff1a;全库采用一致的命名规范简洁性&#xff1a;在表达清晰的前提下尽量简短规范性&#xff1a;遵循数据库标准规范可读性&#xff1a;命名…...

计算机网络基础(2):网络安全/ 网络通信介质

1. 网络安全威胁 网络安全&#xff1a;目的就是要让网络入侵者进不了网络系统&#xff0c;及时强行攻入网络&#xff0c;也拿不走信息&#xff0c;改不了数据&#xff0c;看不懂信息。 事发后能审查追踪到破坏者&#xff0c;让破坏者跑不掉。 网络威胁来自多方面&#xff1a…...

Reactor

文章目录 正确的理解发送double free问题 1.把我们的reactor进行拆分2.链接管理3.Reactor的理论 listensock只需要设置_recv_cb&#xff0c;而其他sock&#xff0c;读&#xff0c;写&#xff0c;异常 所以今天写nullptr其实就不太对&#xff0c;添加为空就没办法去响应事件 获…...

介绍 Html 和 Html 5 的关系与区别

HTML&#xff08;HyperText Markup Language&#xff09;是构建网页的标准标记语言&#xff0c;而 HTML5 是 HTML 的最新版本&#xff0c;包含了一些新的功能、元素、API 和属性。HTML5 相对于早期版本的 HTML&#xff08;比如 HTML4&#xff09;有许多重要的改进和变化。以下是…...

已有 containerd 的情况下部署二进制 docker 共存

文章目录 [toc]学习目的开始学习dockerd启动 containerd准备配置文件启动 containerd 启动 docker准备配置文件启动 docker 环境验证停止 docker 和 containerd 学习目的 使用容器的方式做一些部署的交付&#xff0c;相对方便很多&#xff0c;不需要担心别人的环境缺少需要的依…...

Springboot @Transactional使用时需注意的几个问题

一、事务的隔离级别 在Springboot应用中&#xff0c;如果我们想实现方法一旦执行有异常产生&#xff0c;就触发事务回滚&#xff0c;可以在方法上面添加Transactional注解。如果应用采用mysql数据库&#xff0c;虽然mysql本身也有事务隔离机制&#xff0c;但在Sping数据库的应…...

西游记战力排名、笔记等

文章目录 战力排名对西游记的理解各个版本游戏题材西游记关卡和妖怪 西游记家喻户晓&#xff0c;没有谁不知道吧&#xff0c;无论是电视剧、影视&#xff0c;还是小说&#xff0c;乃至游戏&#xff0c;很多地方都有西游记的身影。 虽然知道&#xff0c;但总不如对三国啊、水浒啊…...

(2024.12)Ubuntu20.04安装ZED-SDK

一.官网地址 ZED SDK 4.2 - Download | Stereolabs 选择适配版本进行下载 二.安装程序 下载完成后&#xff0c;进入文件目录&#xff0c;打开终端&#xff0c;输入&#xff1a; chmod x ZED_SDK_Ubuntu20_cuda11.8_v4.2.2.zstd.run ./ZED_SDK_Ubuntu20_cuda11.8_v4.2.2.zst…...

Pytorch | 从零构建GoogleNet对CIFAR10进行分类

Pytorch | 从零构建GoogleNet对CIFAR10进行分类 CIFAR10数据集GoogleNet网络结构特点网络整体架构应用与影响Inceptionv1到Inceptionv2 GoogleNet结构代码详解结构代码代码详解Inception 类初始化方法前向传播 forward GoogleNet 类初始化方法前向传播 forward 训练过程和测试结…...

蓝桥杯刷题——day9

蓝桥杯刷题——day9 题目一题干解题思路一代码解题思路二代码 题目二题干解题思路代码 题目一 题干 小蓝最近在研究一种浮点数的表示方法&#xff1a;R格式。对于一个大于0的浮点数d&#xff0c;可以用R格式的整数来表示。给定一个转换参数n&#xff0c;将浮点数转换为R格式整…...

ffmpeg翻页转场动效的安装及使用

文章目录 前言一、背景二、选型分析2.1 ffmpeg自带的xfade滤镜2.2 ffmpeg使用GL Transition库2.3 xfade-easing项目三、安装3.1、安装依赖([参考](https://trac.ffmpeg.org/wiki/CompilationGuide/macOS#InstallingdependencieswithHomebrew))3.2、获取ffmpeg源码3.3、融合xf…...

分布式刚度编织,让可穿戴触觉更出色 ——Haptiknit

大家好&#xff01;今天来了解一项非常有趣的科技成果 ——“Haptiknit&#xff1a;用于可穿戴触觉的分布式刚度编织”——《Haptiknit: Distributed stiffness knitting for wearable haptics》发表于《SCIENCE ROBOTICS》。在现代科技发展中&#xff0c;可穿戴触觉设备越来越…...

Elasticsearch:什么是查询语言?

查询语言定义 查询语言包括数据库查询语言 (database query language - DQL)&#xff0c;是一种用于查询和从数据库检索信息的专用计算机语言。它充当用户和数据库之间的接口&#xff0c;使用户能够管理来自数据库管理系统 (database management system - DBMS) 的数据。 最广…...

PyQt介绍

**PyQt 和 PySide (Qt for Python) 简介** **PyQt** 和 **PySide** 是 Python 中用于开发图形用户界面 (GUI) 应用程序的两个主要框架&#xff0c;它们都是基于 Qt 库的绑定。Qt 是一个跨平台的应用程序开发框架&#xff0c;广泛用于创建图形用户界面、应用程序开发以及嵌入式…...

Oracle 数据库函数的用法(一)

Oracle数据库提供了大量的内置函数&#xff0c;可以用于完成各种操作&#xff0c;如字符串操作&#xff0c;数学计算&#xff0c;日期时间处理&#xff0c;条件判断&#xff0c;序列生成&#xff0c;聚合统计等。以下是一些常用的Oracle数据库函数&#xff1a; 一、oracle 使用…...

labelme标签批量转换数据集json_to_dataset

文章目录 labelme标签批量转换数据集json_to_dataset转换原理单张图片转换多张图片批量转换bat脚本循环法 标注图片提取标注图片转单通道 labelme标签批量转换数据集json_to_dataset 转自labelme批量制作数据集教程。 转换原理 在安装了labelme的虚拟环境中有一个labelme_js…...

《QT 5.14.1 搭建 opencv 环境全攻略》

《QT 5.14.1 搭建 opencv 环境全攻略》 一、引言二、准备工作&#xff08;一&#xff09;软件下载&#xff08;二&#xff09;系统环境确认 三、安装 QT 5.14.1&#xff08;一&#xff09;安装包下载与运行&#xff08;二&#xff09;环境变量配置 四、OpenCV 安装与配置&#…...

Sentry日志管理thinkphp8 tp8 sentry9 sentry8 php8.x配置步骤, tp8自定义异常处理类使用方法

tp8的默认使用的就是composer来管理第三方包, 所以直接使用 composer 来安装 sentry9 即可. 同时tp8和tp5的配置方式不太一样, 这里我们直接使用自定义异常类来处理Sentry的异常. 1. 安装 sentry9 包 # 安装 sentry9 包 composer require "tekintian/sentry9-php" …...

MySQL 基础:开启数据库之旅

MySQL 基础&#xff1a;开启数据库之旅 在当今数字化的时代&#xff0c;数据扮演着至关重要的角色&#xff0c;而数据库管理系统则是存储、管理和操作这些数据的强大工具。MySQL 作为一款广受欢迎的开源关系型数据库管理系统&#xff0c;被广泛应用于各类网站、应用程序以及企业…...

OpenTK 中帧缓存的深度解析与应用实践

摘要: 本文深入探讨了 OpenTK 中帧缓存的使用。首先介绍了帧缓存的基本概念与在图形渲染管线中的关键地位,包括其与颜色缓存、深度缓存、模板缓存等各类缓存的关联。接着详细阐述了帧缓存对象(FBO)的创建、绑定与解绑等操作,深入分析了纹理附件、渲染缓冲区附件在 FBO 中的…...

stm32制作CAN适配器5--WinUsb上位机编写

上次我们要stm32制作了一个基于winusb有canfd适配器&#xff0c;今天我们来制作一个上位机程序来进行报文收发。 上位机还是用以前写好的&#xff0c;只是更改下dll文件。 项目链接器&#xff0c;输入&#xff0c;附加依赖项中增加winusb.lib winusb初始化&#xff1a;#incl…...

【时间之外】IT人求职和创业应知【71】-专利费

目录 2025 ICT产业趋势年会召开&#xff0c;2024年度ICT十大新闻重磅揭晓 海纳致远数字科技申请定制化插件驱动的数据分析专利 阿波罗智联取得语音数据的处理方法、装置、设备和存储介质专利 心勿贪&#xff0c;贵知足。 感谢所有打开这个页面的朋友。人生不如意&#xff0…...

springboot vue 会员营销系统

springboot vue 会员营销系统介绍 演示地址&#xff1a; 开源版本&#xff1a;http://8.146.211.120:8083/ 完整版本&#xff1a;http://8.146.211.120:8086/ 移动端 http://8.146.211.120:8087/ 简介 欢迎使用springboot vue会员营销系统。本项目包含会员储值卡、套餐卡、计…...

Kafka快速扫描

Architecture 系统间解耦&#xff0c;异步通信&#xff0c;削峰填谷 Topic 消息主题&#xff0c;用于存储消息 Partition 分区&#xff0c;通过扩大分区&#xff0c;可以提高存储量 Broker 部署Kafka服务的设备 Leader kafka主分区 Follwer kafka从分区 高性能之道&#xff1a…...

scala基础学习(数据类型)-字符串

文章目录 scala中的字符串引号单引号双引号三引号 常用内置函数length 获取字符串长度charAt 字符串元素访问substring 获取字串indexOf 获取字串位置replace 字符串替换toLowerCase,toUpperCase 字符串大小写转换trim 去除首位空白符split 字符串切割以及查看startsWith,endsW…...

网络架构与IP技术:4K/IP演播室制作的关键支撑

随着科技的不断发展&#xff0c;广播电视行业也在不断迭代更新&#xff0c;其中4K/IP演播室技术的应用成了一个引人注目的焦点。4K超高清技术和IP网络技术的结合&#xff0c;不仅提升了节目制作的画质和效果&#xff0c;还为节目制作带来了更高的效率和灵活性。那么4K超高清技术…...

如何优雅的关闭GoWeb服务器

以下内容均为Let’s Go Further内容节选以及作者本人理解。 这里创建了一个后台进程用于捕获关闭信号&#xff0c;在后台进程中&#xff0c;主要内容为&#xff1a; 创建一个缓冲通道 quit使用signal.Notify函数监听并捕获关机信号SIGINT,SIGTERM&#xff0c;在捕获关机信号后…...

Python爬虫(5) --爬取网页视频

文章目录 爬虫爬取视频指定url发送请求UA伪装请求页面 获取想要的数据解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具&#xff0c;用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持&#xff08;如 requ…...

simulink离散传递函数得到差分方程并用C语言实现

一. 创建连续时间的传递函数 G ( s ) s 2 217 s s 2 384 s 8989 G(s) \frac{s^2217s}{s^2384s8989} G(s)s2384s8989s2217s​ 二. 离散连续时间的传递函数G(s) 2.1 在matlab中用c2d函数双线性变换法离散G(s)&#xff0c; 下面是matlab脚本代码 % 创建连续时间传递函数 …...

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书正式赛题

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书-A 目录 一、竞赛阶段 二、竞赛任务书内容 &#xff08;一&#xff09;拓扑图 &#xff08;二&#xff09;模块A 基础设施设置与安全加固(200分) &#xff08;三&#xff09;B模块安全事件响应/网络安全数据取证/…...