用GIF软件做的GIF 超出网站限制/app安装下载
LeetCode刷题记录 |
- 🌐 我的博客主页:iiiiiankor
- 🎯 如果你觉得我的内容对你有帮助,不妨点个赞👍、留个评论✍,或者收藏⭐,让我们一起进步!
- 📝 专栏系列:LeetCode 刷题日志
- 🌱 文章内容来自我的学习与实践经验,如果你有任何想法或问题,欢迎随时在评论区交流讨论。让我们一起探索更多的可能!🚀
💚文章目录💚
- ✨前言✨
- ☢️注意☢️
- 🚀LeetCode225.用队列实现栈
- 一、🌟题目描述🌟
- 二、🎨分析🎨
- 三、💥题解💥
- 栈"的结构定义
- Push接口
- Pop接口
- 获取栈顶元素
- 判断栈是否为空
- 释放free
- ✏️总代码✏️
- 🚀LeetCode232.用栈实现队列
- 一、🌟题目描述🌟
- 二、🎨分析🎨
- 三、💥题解💥
- 模拟队列的结构
- 初始化队列
- Push
- Pop
- 获取队头元素
- 判断是不是空
- 释放
- ✏️总代码✏️
✨前言✨
首先我们可以先复习一下相关性质:
- 栈:
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为
栈顶
,另一端称为栈底
。
栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶
实现方法:1. 数组(顺序表) 2.链表
- 队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
入队列
:进行插入操作的一端称为队尾
出队列
:进行删除操作的一端称为队头
实现:1.链表(更优)2.数组(较差)
☢️注意☢️
C语言中并不想C++或者Java等高级语言那样,库中有封装好的栈和队列
所以我们用C做这些题的时候,都必须先把栈或者队列写出来,才能做题!
这也是用C刷题的很恶心的地方
但是 也能巩固我们的知识不是嘛?
🚀LeetCode225.用队列实现栈
链接:LeetCode225.用队列实现栈
一、🌟题目描述🌟
二、🎨分析🎨
我们知道,队列是先进先出,而栈是后进先出,那么怎么用队列实现栈呢?
我们通过画图来分析:
如果给你一个不为空的队列,我们叫他noempty
:
这个队列是 按照 1 2 3 4 的顺序放入的数据
所以 如果是队列的话 那么出队列的顺序也是 1 2 3 4
但是如果想要实现栈,那么第一个出去的数据应该是4
我们怎么实现呢?
如果我们还有一个空的队列,我们叫他empty
我们把1 2 3 放到empty
里面,那么noempty
里就只剩下了 4,如图:
这样,noempty
的队头就是4 我们直接对noempty
进行pop
然后 队列的性质是先进先出,所以在empty
中也是 原来的1 2 3顺序
empty
出队列的顺序也是1 2 3
所以 我们只需要把empty
中的元素再倒回noempty
中
我们再观察noempty
,是不是就完成了栈的后进先出的性质!!!
(因为 4 是最后进入的)
综上所述,其实empty
就是用来倒数据的!
因此我们要时刻保证一个是空队列,另一个是非空队列
这道题目实际上就是利用一个空队列和队列的相关性质,来实现栈的 后进先出的!
三、💥题解💥
栈"的结构定义
这里的“栈” 是我们目标实现的那个栈
-
结构需要包含两个队列
注意: 此类型题目的结构比较复杂
因为我们使用链表实现的栈,所以“栈”中包含的队列的结构中还有 -
链表头节点
-
链表尾节点
“栈”的结构
//这里是匿名结构体 因为有typedef 后面可以使用匿名结构体
typedef struct {//结构中包含两个队列Queue q1;Queue q2;
} MyStack;
队列的结构:
typedef struct Queue {size_t size;//利用一个变量去标识队列的大小QNode* head;//队列的头节点QNode* tail;//队列的尾节点
}Queue;
Push接口
由于我们需要保持一个队列为空,另一个队列不为空
对于push接口,我们只需要判断哪一个队列不为空
然后向该队列push数据就可以了
Pop接口
如果要pop数据,如1 2 3 4 5
模拟实现栈,所以要出栈,也就是删除栈顶
而栈顶就是队列的队尾
所以要删除5
只需要把前面一个个数据挪动到空队列
直接让5出队就可以了注意这里题目让你返回pop掉的元素!
获取栈顶元素
显示栈顶元素
只需要找到不为空的队列就可以了
这里我们不需要考虑如果两个队列都为空了怎么办
只要完成他给的接口就可以了!
测试用例一定是正确合理的! 不会出现空了还让你调用这个函数的情况
: 测试用例就是看你逻辑正不正确!
判断栈是否为空
因为我们的栈是用两个队列来实现的
所以 如果两个队列都为空,那么说明栈为空!
释放free
- 首先把结构中包含的两个队列释放掉
- 然后把该结构释放掉
✏️总代码✏️
// 用队列实现栈typedef int QDataType;
//定义队列节点的结构
typedef struct QueueNode {struct QueueNode* next;QDataType val;//队列中的数据
}QNode;//利用封装一个结构
typedef struct Queue {size_t size;//利用一个变量去标识队列的大小QNode* head;//队列的头节点QNode* tail;//队列的尾节点
}Queue;//初始化
void QueueInit(Queue* pq);
//入队列
void QueuePush(Queue* pq, QDataType x);
//出队列
void QueuePop(Queue* pq);
//获取队头元素
QDataType QueueFront(Queue* pq);
//获取队尾元素
QDataType QueueBack(Queue* pq);
//获取队列中元素个数
int QueueSize(Queue* pq);
//检测队列是否为空
bool QueueEmpty(Queue* pq);
//销毁队列
void QueueDestory(Queue* pq);//初始化
void QueueInit(Queue* pq)
{assert(pq);//头节点和尾节点都设置为空即可pq->head = pq->tail = NULL;pq->size = 0;}
//入队列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){printf("malloc fail!");exit(-1);}newnode->next = NULL;newnode->val = x;//如果队列为空if (pq->tail == NULL)//也可以使用head==NULL{pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;//更新尾部}pq->size++;
}
//出队列
void QueuePop(Queue* pq)
{assert(pq);//如果只有一个节点if (pq->head->next == NULL)//这里需要用head的next{free(pq->head);pq->head = pq->tail = NULL;pq->size--;//队列元素个数减一}else{QNode* next = pq->head->next;free(pq->head);pq->head = next;pq->size--;}
}
//获取队头元素
QDataType QueueFront(Queue* pq)
{assert(pq);//如果队列为空 无法获取!assert(!QueueEmpty(pq));return pq->head->val;
}
//获取队尾元素
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->val;
}
//获取队列中元素个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
//检测队列是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);//如果 head为空 返回真 否则返回假return pq->head == NULL;
}
//销毁队列
void QueueDestory(Queue* pq)
{assert(pq);//只需要逐个释放就可以了QNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;
}/*****************************************/
/* 题解代码 */
typedef struct {//结构中包含两个队列Queue q1;Queue q2;
} MyStack;//初始化
MyStack* myStackCreate() {//首先需要开辟一个stackMyStack* obj = (MyStack*)malloc(sizeof(MyStack));//然后对开辟的Mystack中的q1和q2初始化QueueInit(&obj->q1);QueueInit(&obj->q2);//然后需要返回objreturn obj;
}void myStackPush(MyStack* obj, int x) {//如果q1不为空 那么就向q1里面插入数据if (!QueueEmpty(&obj->q1)){QueuePush(&obj->q1, x);}else//否则就向q2里面插入数据{QueuePush(&obj->q2, x);}
}int myStackPop(MyStack* obj) {//首先需要判断哪一个不为空//先假设q1为空 q2不为空Queue* empty = &obj->q1;Queue* noempty = &obj->q2;//如果假设错了 就改一下if (!QueueEmpty(&obj->q1)){empty = &obj->q2;noempty = &obj->q1;}//然后就把非空队列的数据导入到空队列 知道非空队列还有一个数据while (QueueSize(noempty) > 1){//把非空队列的队头 push到空队列QueuePush(empty, QueueFront(noempty));QueuePop(noempty);}//因为对于栈顶元素需要返回和删除//所以先把栈顶元素记录一下啊int top = QueueFront(noempty);QueuePop(noempty);return top;
}int myStackTop(MyStack* obj) {//既然是显示栈顶元素//那就需要找到非空队列//显示非空队列的队尾就可以了//如果队列q1不为空if (!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);}else{return QueueBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj) {//如果两个队列都是空的 那么栈就是空return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}void myStackFree(MyStack* obj) {//1. 释放Mystackj里面包含的q1 和 q2 (他们里面也有malloc的节点)//2. 释放 MystackQueueDestory(&obj->q1);QueueDestory(&obj->q2);free(obj);
}
🚀LeetCode232.用栈实现队列
链接:LeetCode232.用栈实现队列
一、🌟题目描述🌟
二、🎨分析🎨
思考:
这个题会不会和上一道题很类似?
我们知道 栈的性质是 后进先出,而队列的性质是先进先出
那么怎么让最先进去的最先出来呢?
画图分一下:
显然 最先入栈的是:1,那么如何让1 先出栈呢?
那么我们是不是可以这样?
把左边的栈的元素全部push到右边的空栈,因为栈是从栈顶出栈
所以 入右边的栈的顺序是4-3-2-1
变成了这样:
这时候,如果想溢出1,只需要pop一下右边的栈就可以了!
然后,我们是不是还要把 剩下的元素倒回原来的左边的栈呢?
注意,这里和上面那个题不一样的地方就在这里!
如果我们把右边的栈的数据倒回左边的栈,变成这样:
这时候如果再出栈,是不是还要重复把左边的栈的数据 重新push到右边的栈?
这无疑增加了工作量!
由于栈有着后进先出的特殊性质,所以 我们只要把左边的栈的数据push到右边的栈,右边的栈中就可以不断的pop(因为此时元素的顺序已经颠倒了!,符合先进先出了)
所以,导入到右边的栈之后,不需要再回来了!!!
然后 怎么push呢?,我们直接向左边的栈中push就可以了!!
也就是说:左边的栈用来push,我们叫做pushst
,右边的栈用来pop,我们叫做popst
如果,popst
已经空了,那么再把pushst
里面的数据push到popst
就可以了!
总结:
- 栈的性质和队列不一样,因为队列是先进先出
所以把一个数据从一个队列push到另一个队列之后,原来的元素顺序不会发生改变
所以需要在倒回来- 而栈的性质不一样,栈是后进先出
所以把`pushst`里的数据导入到`popst`之后,数据的顺序发生颠倒
所以,由于已经颠倒过来,把`popst`里的数据进行pop,就相当于队列的出队!
而不需要再倒回`pushst`的原因是因为: 这时候的`popst`里的数据顺序恰好是出队顺序
而如果重新导入`pushst`,那么再pop数据的时候,还需要把数据先push到`popst`中- 这样,如果我们想push数据,直接push到`pushst`中,
当`popst`空的时候,把`pushst`中数据导入到`popst`中,从而实现继续出队!
也就是说:
pushst
控制入队,popst
控制出队
这个结构就相当于
三、💥题解💥
模拟队列的结构
包含两个栈
//匿名结构体的使用 可以利用typedef!
typedef struct {ST pushst;ST popst;
} MyQueue;
初始化队列
首先malloc一个 ‘队列’
然后要初始化 队列中的两个栈
pushst
用来push
popst
用来pop
MyQueue* myQueueCreate() {MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));//初始化两个栈StackInit(&obj->pushst);StackInit(&obj->popst);return obj;
}
Push
这样其实 push就很简单了
只需要向栈pushst
里直接push就可以了!
void myQueuePush(MyQueue* obj, int x) {//入队统一在push栈中入数据StackPush(&obj->pushst,x);
}
Pop
pop比较麻烦,但也很简单
因为我们首先判断popst
是不是为空
如果为空,那么pushst
中的数据push到popst
否则直接poppopst
int myQueuePop(MyQueue* obj) {//出栈 是对pop进行的//如果popst为空 那么首先把pushst里的数据导入到popstif(StackEmpty(&obj->popst)){while(!StackEmpty(&obj->pushst)){StackPush(&obj->popst,StackTop(&obj->pushst));StackPop(&obj->pushst);}}//需要记录队尾 并返回int qtail=StackTop(&obj->popst);//出队StackPop(&obj->popst);//返回队尾元素return qtail;}
获取队头元素
由于
popst
的栈顶就相当于队头,所以直接返回popst
的栈顶就可以了!
注意:需要判断一下popst
是不是为空!
如果为空 需要把pushst
中的数据 先 push到popst
int myQueuePeek(MyQueue* obj) {//队列的头相当于 popst的栈顶//首先判断是不是空 如果是空 导入到popstif(StackEmpty(&obj->popst)){while(!StackEmpty(&obj->pushst)){StackPush(&obj->popst,StackTop(&obj->pushst));StackPop(&obj->pushst);}}return StackTop(&obj->popst);
}
判断是不是空
显然如果两个栈都为空 说明队列为空
bool myQueueEmpty(MyQueue* obj) {//什么时候为空呢?//显然 如果两个栈都为空 说明队列为空return StackEmpty(&obj->pushst) && StackEmpty(&obj->popst);
}
释放
- 首先释放两栈
- 然后释放队列结构
void myQueueFree(MyQueue* obj) {//首先释放两个栈//然后释放MyQueueStackDestory(&obj->pushst);StackDestory(&obj->popst);free(obj);
}
✏️总代码✏️
typedef int STDataType;
typedef struct Stack {//动态开辟数组STDataType* a;int top;//栈顶int capacity;//容量
}ST;
//初始化
void StackInit(ST* ps);
//压栈
void StackPush(ST* ps, STDataType x);
//出栈
void StackPop(ST* ps);
//获取栈中有效元素个数
int StackSize(ST* ps);
//显示栈顶元素
STDataType StackTop(ST* ps);
//检测栈是否为空
bool StackEmpty(ST* ps);
//销毁
void StackDestory(ST* ps);//初始化
void StackInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->top = 0;
}
//压栈
void StackPush(ST* ps, STDataType x)
{assert(ps);//首先检查是不是需要扩容if (ps->top == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * newCapacity);if (tmp == NULL){printf("realloc fail");exit(-1);}ps->capacity = newCapacity;ps->a = tmp;}ps->a[ps->top] = x;ps->top++;
}
//出栈
void StackPop(ST* ps)
{assert(ps);//有元素才能出栈assert(ps->top > 0);//只需要ps--就可以了ps->top--;}
//获取栈中有效元素个数
int StackSize(ST* ps)
{assert(ps);return ps->top;
}
//获取栈顶元素
STDataType StackTop(ST* ps)
{assert(ps);return ps->a[ps->top-1];
}
//检测栈是否为空
bool StackEmpty(ST* ps)
{ assert(ps);return ps->top == 0;
}
//销毁
void StackDestory(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;//ps->a 不用了 所以置空就可以了ps->capacity = ps->top = 0;
}//匿名结构体的使用 可以利用typedef!
typedef struct {ST pushst;ST popst;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));//初始化两个栈StackInit(&obj->pushst);StackInit(&obj->popst);return obj;
}void myQueuePush(MyQueue* obj, int x) {//入队统一在push栈中入数据StackPush(&obj->pushst,x);
}int myQueuePop(MyQueue* obj) {//出栈 是对pop进行的//如果popst为空 那么首先把pushst里的数据导入到popstif(StackEmpty(&obj->popst)){while(!StackEmpty(&obj->pushst)){StackPush(&obj->popst,StackTop(&obj->pushst));StackPop(&obj->pushst);}}//需要记录队尾 并返回int qtail=StackTop(&obj->popst);//出队StackPop(&obj->popst);//返回队尾元素return qtail;}int myQueuePeek(MyQueue* obj) {//队列的头相当于 popst的栈顶//首先判断是不是空 如果是空 导入到popstif(StackEmpty(&obj->popst)){while(!StackEmpty(&obj->pushst)){StackPush(&obj->popst,StackTop(&obj->pushst));StackPop(&obj->pushst);}}return StackTop(&obj->popst);
}bool myQueueEmpty(MyQueue* obj) {//什么时候为空呢?//显然 如果两个栈都为空 说明队列为空return StackEmpty(&obj->pushst) && StackEmpty(&obj->popst);
}void myQueueFree(MyQueue* obj) {//首先释放两个栈//然后释放MyQueueStackDestory(&obj->pushst);StackDestory(&obj->popst);free(obj);
}/*** Your MyQueue struct will be instantiated and called as such:* MyQueue* obj = myQueueCreate();* myQueuePush(obj, x);* int param_2 = myQueuePop(obj);* int param_3 = myQueuePeek(obj);* bool param_4 = myQueueEmpty(obj);* myQueueFree(obj);
*/
✨感谢阅读~ ✨
❤️码字不易,给个赞吧~❤️
相关文章:

【C语言实现:用队列模拟栈与用栈模拟队列(LeetCode 225 232)】
LeetCode刷题记录 🌐 我的博客主页:iiiiiankor🎯 如果你觉得我的内容对你有帮助,不妨点个赞👍、留个评论✍,或者收藏⭐,让我们一起进步!📝 专栏系列:LeetCode…...

远程控制软件对比与使用推荐
远程控制软件对比与使用推荐 远程控制软件在现代工作环境中扮演着重要角色,无论是远程办公、技术支持、还是家庭成员之间的协助。以下是对几种常见远程控制软件的详细对比和推荐使用场景。 1. TeamViewer 特点 跨平台:支持Windows、macOS、Linux、iO…...

vue canvas 绘制选定区域 矩形框
客户那边文档相当的多,目前需要协助其将文档转为数据写入数据库,并与其他系统进行数据共享及建设,所以不得不搞一个识别的功能,用户上传PDF文档后,对于关键信息点进行识别入库! 以下为核心代码,…...

【SpringCloud】OpenFeign配置时间Decode
文章目录 1.自定义反序列化器2.配置类与自定义 ObjectMapper客户端 需求:OpenFeign配置自定义decode,解析http请求返回的时间字符串 1.自定义反序列化器 Date 自定义反序列化器 import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.j…...

Xerces-C,一个成熟的 C++ XML 解析库!
嗨,大家好!我是一行。今天咱们来探索 Xerces-C,它可是 C里超棒的 XML 解析库哦!能帮咱轻松处理 XML 数据,在很多数据交互、配置文件读取场景都超实用,快来一起学习使用它的妙招吧。 一、Xerces-C 是什么&am…...

6.2 MapReduce工作原理
MapReduce工作原理涉及将大数据集分割成小块并行处理。Map任务读取数据块并输出中间键值对,而Reduce任务则处理这些排序后的数据以生成最终结果。MapTask工作包括读取数据、应用Map函数、收集输出、内存溢出时写入磁盘以及可选的Combiner局部聚合。ReduceTask工作则…...

一次旧业务系统迁移收缩的经历
单位的一个业务系统,在几年前已经更换了。但旧的系统里面还有很多没有转移过来的数据,虽然普通用户不再需要用旧的系统,但相应部门的管理人员还需要在旧系统查询数据资料,这应该是旧系统向新系统迁移时,数据不彻底&…...

MVC配置文件及位置
配置文件位置 默认位置 WEB-INF目录下,文件名:<servlet-name>-servlet.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.…...

如何解决samba服务器共享文件夹不能粘贴文件
sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效: sudo service smbd restart...

【中工开发者】鸿蒙商城app
这学期我学习了鸿蒙,想用鸿蒙做一个鸿蒙商城app,来展示一下。 项目环境搭建: 1.开发环境:DevEco Studio2.开发语言:ArkTS3.运行环境:Harmony NEXT base1 软件要求: DevEco Studio 5.0.0 Rel…...

(九)机器学习 - 多项式回归
多项式回归(Polynomial Regression)是一种回归分析方法,它将自变量 xx 和因变量 yy 之间的关系建模为 nn 次多项式。多项式回归的目的是找到一个 nn 次多项式函数,使得这个函数能够最好地拟合给定的数据点。 多项式回归的数学表达…...

Qt编写区位码gb2312、机内码、国标码————附带详细介绍和编码实现
文章目录 0 背景1 了解编码1.1 ASCII码1.2 机内码、国标码、区位码1.2.1 区位码1.2.2 国标码(GB 2312-80)1.2.3 汉字机内码(GB 2312) 1.3 GBK和GB2312的区别2 编码实现2.1 QString数据转QByteArray类型2.1.1 使用QTextCodec2.1.2 …...

linux网络编程 | c | epoll实现IO多路转接服务器
epoll实现IO多路转接服务器 可通过以下视频学习 06-opell函数实现的多路IO转接_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 epoll实现IO多路转接服务器1.思路&功能核心思路 2.代码实现multi_epoll_sever.c运行图 1.思路&功能 **功能:**客…...

Source Insight的使用经验汇总
01-Add All"和“Add Tree”有何区别? 在 Source Insight 中,“Add All”和“Add Tree”是两种向项目(Project)中添加文件的操作选项,它们的区别在于处理文件和目录的方式不同: 1. Add All 范围&am…...

VSCode 报错:rust-analyzer requires glibc >= 2.28 in latest build
报错信息 /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.953/server/rust-analyzer: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.29 not found (required by /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.9…...

Android Link to Death 使用
Java侧: 【android学习】使用linkToDeath对AIDL双向死亡监听_unlinktodeath-CSDN博客 Native侧: Service端 using namespace android; class MyService :public IBinder::DeathRecipient{void MyService::binderDied(const wp<IBinder>& wh…...

【C++游记】string的使用和模拟实现
枫の个人主页 你不能改变过去,但你可以改变未来 算法/C/数据结构/C Hello,这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕,我们继续来学习C的内容呀。C是接近底层有比较经典的语言,因此学习起来注定枯燥无味…...

DockerUI info存在未授权访问漏洞
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

SQL,查询每天最接近指定时间的记录
Oracle 数据库的某表有一列是日期时间类型,每天对应多条数据: td1.1.2024 08:08:0811.1.2024 10:10:1021.1.2024 15:15:1531.1.2024 20:20:2042.1.2024 09:09:0952.1.2024 12:12:1262.1.2024 16:16:16712.12.2024 16:16:168 现在要从每天找出两条记录&…...

ElasticSearch如何做性能优化?
大家好,我是锋哥。今天分享关于【ElasticSearch如何做性能优化?】面试题。希望对大家有帮助; ElasticSearch如何做性能优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中,性能优化是…...

【Linux】虚拟空间布局模型地址回填数据段合并(万字详解)
Ⅰ、虚拟空间布局模型 理论模型 包括上节的动态库与静态库,加上本节后面两个内容其实都是对gcc的扩展与补充知识,也是需要了解和掌握的知识。在开讲之前,我们先来说一下在32位x86的Linux系统中,虚拟地址空间布局模型:…...

const和修饰指针的几种用法
昨天闲着没事去面试了一个C岗位,问了很多基础的东西都没答上来。主要原因是这些知识在硬件资源丰富的pc端用的不多,二来确实很久没温习之前的C相关的知识了。在面试官问了几次类似的问题没有答好的情况下(还喜欢问你确不确定)&…...

mybatis事务的自动提交与手动提交
MyBatis支持自动提交和手动提交两种事务管理方式。 自动提交事务 MyBatis默认使用自动提交模式,即每个SQL操作都会自动提交到数据库中。这意味着在执行完一条SQL语句后,MyBatis会自动调用commit()方法将更改持久化到数据库。 手动提交事务 可以通过Sq…...

网络安全协议之比较(SSH、PKI、SET、SSL)
一、SSH介绍 什么是SSH? 传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据, 别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的…...

Vue的生命周期方法
Vue 生命周期方法详解 beforeCreate 执行时机:在实例初始化之后,数据观测(data observer)和事件配置(event/watcher setup)之前被调用。内部状态:此时,组件的选项对象(例…...

ISP和IQ调试(一)
系列文章目录 文章目录 系列文章目录前言一、ISP(image signal process)二、ISP位置三、IQ总结 前言 一、ISP(image signal process) image signal process 图像处理技术 image signal processor 图像信号处理器 设备 什么是图像信号? 代表…...

c# TaskScheduler
这里记录下 TaskScheduler 的简单用法。 使用场景: 使用 Task 的时候,大家知道用 TaskFactory.StartNew 可以用来创建一个 Task 。这里如果创建了 3 个,那么这3个 Task 就各自放飞直接运行了。 class Program {private static TaskFactory…...

可视化数据
数据科学家会直观呈现数据,以更好地理解数据。 他们可以扫描原始数据、检查摘要度量值(如平均值)或绘制数据图表。 图表是一种可视化数据的强有力方式,数据科学家经常使用图表快速了解适度复杂的模式。 直观地表示数据 绘制图表…...

【Redis】Redis缓存击穿
1. 概述 缓存击穿:缓存击穿问题也叫热点key问题,一个高并发的key或重建缓存耗时长(复杂)的key失效了,此时大量的请求给数据库造成巨大的压力。如下图,线程1还在构建缓存时,线程2,3&…...

厦门凯酷全科技有限公司深耕抖音电商运营
在数字经济飞速发展的今天,抖音电商平台以其独特的社交属性和庞大的用户基础,迅速成为众多品牌和商家的新战场。在这个充满机遇与挑战的市场中,厦门凯酷全科技有限公司凭借其专业的服务、创新的理念和卓越的执行力,成为了抖音电商…...