【C++】OJ习题 篇2

头像
🚀个人主页:奋斗的小羊
🚀所属专栏:C++
很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

动图描述

目录

    • 💥1、删除有序数组中的重复项
    • 💥2、数组中出现次数超过一半的数字
    • 💥3、最小栈
    • 💥4、栈的压入、弹出序列
    • 💥5、环形链表
    • 💥6、环形链表 II
    • 💥7、用队列实现栈
    • 💥8、用栈实现队列
    • 💥9、设计循环队列
    • 💥10、判断二叉树是否是完全二叉树


💥1、删除有序数组中的重复项

  • Leetcode——删除有序数组中的重复项

在这里插入图片描述
示例:

在这里插入图片描述

可以用快慢指针,快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标1,这是为了体现慢指针记录不重复的数据个数。
删除重复项和找不重复的项效果是一样的。

class Solution {
public:int removeDuplicates(vector<int>& nums) {int slow = 1;for (int fast = 1; fast < nums.size(); ++fast){if (nums[fast] != nums[fast - 1]){nums[slow++] = nums[fast];}}return slow;}
};

💥2、数组中出现次数超过一半的数字

  • 牛客——数组中超过一半的数字

在这里插入图片描述

方法一:候选法

  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

初始化一个候选目标val和得票数count,遍历数组,如果当前的得票数count为0的话就选当前在数组中拿到的元素为目标,如果得票数count不为0,有和val相等的元素就给它投一票,遇到不相等的就减一票。 遍历完数组后val就是出现次数超过数组长度一般的数。

  • 我们暂且将出现次数超过数组长度一半的数称作众数。数组中如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数
class Solution {
public:int MoreThanHalfNum_Solution(vector<int>& numbers) {int val = 0;int count = 0;for (int e : numbers){if (0 == count){val = e;++count;}else {count = val == e ? ++count : --count;}}return val;}
};

方法二:排序法

  • 时间负责度:O(N*logN)
  • 空间负责度:O(1)

既然众数的个数超过了数组长度的一半,那有序数组中间位置的数一定就是众数。

class Solution {
public:int MoreThanHalfNum_Solution(vector<int>& numbers) {sort(numbers.begin(), numbers.end());return numbers[numbers.size() / 2];}
};

💥3、最小栈

  • Leetcode——最小栈

在这里插入图片描述
定义一个主栈和辅助栈,主栈支持push、pop、top操作,辅助栈用于存相比于栈顶数据更小的或相等的数,主栈pop时如果栈顶数据和辅助栈栈顶数据相等,辅助栈也跟着pop,那么常数时间内检索到的最小元素就是辅助栈栈顶数据。

在这里插入图片描述

class MinStack {
public:MinStack() {}void push(int val) {_st.push(val);if (_minst.empty() || val <= _minst.top()){_minst.push(val);}}void pop() {if (_st.top() == _minst.top()){_minst.pop();}_st.pop();}int top() {return _st.top();}int getMin() {return _minst.top();}
private:stack<int> _st;stack<int> _minst;
};

💥4、栈的压入、弹出序列

  • 牛客——栈的压入、弹出序列

在这里插入图片描述

定义一个栈用于压入数据,一个下标用于访问弹出序列。将压入序列依次放入栈中,期间如果某次压入的值和弹出序列的第一个数相等,那么就弹出刚压入的这个数,再++下标。
其中弹出栈中的数时要保证栈不为空,当访问完所有的压入数据后,检查栈是否为空,如果为空则返回真,否则返回假。

class Solution {
public:bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {// write code hereint i = 0;for (int e : pushV){_st.push(e);while (!_st.empty() && _st.top() == popV[i]){_st.pop();++i;}}return _st.empty();}
private:stack<int> _st;
};

💥5、环形链表

  • Leetcode——环形链表

在这里插入图片描述

快慢指针法: 快指针和慢指针初始时指向头节点,当快指针指向和快指针指向节点内的next指针不为空时,快指针一次走两步,慢指针一次走一步,快指针入环后走N圈后慢指针入环,当快指针和慢指针相等时说明存在环,如果出循环则说明不存在环。

关键的地方是快指针一次走两步,慢指针一次走一步,如果存在环则快指针和慢指针一定会相遇。为什么一定会相遇呢?
如果存在环,假设当慢指针入环时快指针距离此时慢指针的位置为N,则接下来每当快指针追赶慢指针一次,它们的距离就减一,直到减为0,此时快慢指针就相遇了。

在这里插入图片描述

bool hasCycle(struct ListNode *head) {struct ListNode* fast = head, *slow = head;while (fast && fast->next){fast = fast->next->next;slow = slow->next;if (fast == slow){return true;}}return false;
}

💥6、环形链表 II

  • Leetcode——环形链表 II

在这里插入图片描述

还是快慢指针,当快慢指针相遇时我们让meet指针指向相遇时的节点,然后让头指针headmeet指针一步步地向后走,当两指针相遇时指向的节点就是链表开始入环的第一个节点。为什么这两个指针一定会相遇在链表开始入环的第一个节点?

假设头指针距离链表开始入环的第一个节点的长度为L,meet指针相距链表开始入环的第一个节点的距离是N,环的长度为C,当慢指针入环时快指针走了x圈,因为快指针的速度是慢指针的2倍,那我们可以得到下面的等式:

  • 2(L + N) = L + X*C + N

化简得:L = X*C - N,由这个等式可以得出headmeet相遇是必然的。
在这里插入图片描述

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* fast = head, *slow = head;while (fast && fast->next){fast = fast->next->next;slow = slow->next;if (fast == slow){struct ListNode* meet = fast;while (head != meet){head = head->next;meet = meet->next;}return meet;}}return NULL;
}

💥7、用队列实现栈

  • Leetcode——用队列实现栈

在这里插入图片描述

栈的特点是后进先出,队列的特点是先进先出,用队列实现栈,必须有一个辅助队列在栈数据pop的时候用来导数据,将栈中需要pop的数据放到队列的队头pop
也就是说用队列实现栈需要两个队列,一个存数据一个导数据,一个为空一个不为空,其中入栈时往不为空的队列中入数据,为空的队列只有一个作用,就是栈pop数据时导数据。
其中队列还有一个重要的特点,就是出队列不会改变数据的相对位置。

在这里插入图片描述

typedef struct {Que q1;Que q2;
} MyStack;MyStack* myStackCreate() {MyStack* pst = (MyStack*)malloc(sizeof(MyStack));QueueInit(&pst->q1);QueueInit(&pst->q2);return pst;
}void myStackPush(MyStack* obj, int x) {if (QueueEmpty(&obj->q1)){QueuePush(&obj->q2, x);}else{QueuePush(&obj->q1, x);}
}int myStackPop(MyStack* obj) {//假设法Que* empty = &obj->q1;Que* noempty = &obj->q2;if (!QueueEmpty(&obj->q1)){empty = &obj->q2;noempty = &obj->q1;}while (QueueSize(noempty) > 1){QueuePush(empty, QueueFront(noempty));QueuePop(noempty);}int top = QueueFront(noempty);QueuePop(noempty);return top;
}int myStackTop(MyStack* obj) {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) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

💥8、用栈实现队列

  • Leetcode——用栈实现队列

在这里插入图片描述

用两个栈实现队列,这里有两个方法。
方法一:和用两个队列实现栈类似,其中的一个栈用来导数据,因为栈的特点是后进先出,所以将栈中的数据导过来会让数据的相对位置颠倒,所以最后还需要将数据重新导回来才能保证数据的相对位置不变。

typedef int st_data_type;typedef struct stack
{st_data_type* arr;int top;int capacity;
}stack;
void stack_init(stack* pst)
{assert(pst);pst->arr = NULL;pst->top = pst->capacity = 0;
}//入栈
void stack_push(stack* pst, st_data_type x)
{assert(pst);if (pst->capacity == pst->top){int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;st_data_type* tmp = (st_data_type*)realloc(pst->arr, newcapacity * sizeof(st_data_type));if (tmp == NULL){perror("realloc fail!");return;}pst->arr = tmp;tmp = NULL;pst->capacity = newcapacity;}pst->arr[pst->top] = x;pst->top++;
}//出栈
void stack_pop(stack* pst)
{assert(pst);assert(pst->top > 0);pst->top--;
}//取出栈顶元素
st_data_type stack_top(stack* pst)
{assert(pst);assert(pst->top > 0);return pst->arr[pst->top-1];
}//销毁
void stack_destroy(stack* pst)
{assert(pst);free(pst->arr);pst->arr = NULL;pst->capacity = pst->top = 0;
}//判空
bool stack_empty(stack* pst)
{assert(pst);return pst->top == 0;
}//获取元素个数
int stack_size(stack* pst)
{assert(pst);return pst->top;
}typedef struct {stack st1;stack st2;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* pqu = (MyQueue*)malloc(sizeof(MyQueue));stack_init(&pqu->st1);stack_init(&pqu->st2);return pqu;
}void myQueuePush(MyQueue* obj, int x) {if (stack_empty(&obj->st1)){stack_push(&obj->st2, x);}else{stack_push(&obj->st1, x);}
}int myQueuePop(MyQueue* obj) {stack* empty = &obj->st1;stack* noempty = &obj->st2;if (stack_empty(&obj->st2)){empty = &obj->st2;noempty = &obj->st1;}while (stack_size(noempty) > 1){stack_push(empty, stack_top(noempty));stack_pop(noempty);}int top = stack_top(noempty);stack_pop(noempty);while (!stack_empty(empty)){stack_push(noempty, stack_top(empty));stack_pop(empty);}return top;
}int myQueuePeek(MyQueue* obj) {stack* empty = &obj->st1;stack* noempty = &obj->st2;if (stack_empty(noempty)){empty = &obj->st2;noempty = &obj->st1;}while (!stack_empty(noempty)){stack_push(empty, stack_top(noempty));stack_pop(noempty);}int top = stack_top(empty);while (!stack_empty(empty)){stack_push(noempty, stack_top(empty));stack_pop(empty);}return top;
}bool myQueueEmpty(MyQueue* obj) {return stack_empty(&obj->st1) && stack_empty(&obj->st2);
}void myQueueFree(MyQueue* obj) {stack_destroy(&obj->st1);stack_destroy(&obj->st2);free(obj);
}

方法二:正是因为栈后进先出的特点,我们可以不用将导过来的数据再导回去,一个栈专门用来入数据,另一个栈专门用来出数据。 很显然这种方法更为简单。

typedef int st_data_type;typedef struct stack
{st_data_type* arr;int top;int capacity;
}stack;
void stack_init(stack* pst)
{assert(pst);pst->arr = NULL;pst->top = pst->capacity = 0;
}//入栈
void stack_push(stack* pst, st_data_type x)
{assert(pst);if (pst->capacity == pst->top){int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;st_data_type* tmp = (st_data_type*)realloc(pst->arr, newcapacity * sizeof(st_data_type));if (tmp == NULL){perror("realloc fail!");return;}pst->arr = tmp;tmp = NULL;pst->capacity = newcapacity;}pst->arr[pst->top] = x;pst->top++;
}//出栈
void stack_pop(stack* pst)
{assert(pst);assert(pst->top > 0);pst->top--;
}//取出栈顶元素
st_data_type stack_top(stack* pst)
{assert(pst);assert(pst->top > 0);return pst->arr[pst->top-1];
}//销毁
void stack_destroy(stack* pst)
{assert(pst);free(pst->arr);pst->arr = NULL;pst->capacity = pst->top = 0;
}//判空
bool stack_empty(stack* pst)
{assert(pst);return pst->top == 0;
}//获取元素个数
int stack_size(stack* pst)
{assert(pst);return pst->top;
}typedef struct {stack pushst;stack popst;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* pst = (MyQueue*)malloc(sizeof(MyQueue));stack_init(&pst->pushst);stack_init(&pst->popst);return pst;
}void myQueuePush(MyQueue* obj, int x) {stack_push(&obj->pushst, x);
}int myQueuePop(MyQueue* obj) {if (stack_empty(&obj->popst)){while (!stack_empty(&obj->pushst)){stack_push(&obj->popst, stack_top(&obj->pushst));stack_pop(&obj->pushst);}}int top = stack_top(&obj->popst);stack_pop(&obj->popst);return top;
}int myQueuePeek(MyQueue* obj) {if (stack_empty(&obj->popst)){while (!stack_empty(&obj->pushst)){stack_push(&obj->popst, stack_top(&obj->pushst));stack_pop(&obj->pushst);}}return stack_top(&obj->popst);
}bool myQueueEmpty(MyQueue* obj) {return stack_empty(&obj->pushst) && stack_empty(&obj->popst);
}void myQueueFree(MyQueue* obj) {stack_init(&obj->pushst);stack_init(&obj->popst);free(obj);
}

💥9、设计循环队列

  • Leetcode——设计循环队列

在这里插入图片描述

这里我们用数组来实现循环队列会相对简单一些,让head指向第一个位置,让tail指向最后一个元素的下一个位置。假设队列长度为K,我们开K + 1个空间,多开一个空间是为了方便区分队列为空和队列为满。也可以在结构体中多加一个变量用来计数。因为如果不多开一个空间,队列为空时是head == tail,队列为满时也是head == tail,无法区分。多开一个空间后,队列为满就是head == (tail + 1) % (k + 1).
tail越界时我们对其模K+1,让tail指向下标为0的位置。
在这里插入图片描述

typedef struct {int* a;int head;int tail;int k;
} MyCircularQueue;bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->head == obj->tail;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return obj->head == (obj->tail + 1) % (obj->k + 1);
}MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* pq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));pq->a = (int*)malloc(sizeof(int)*(k + 1));pq->head = pq->tail = 0;pq->k = k;return pq;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if (myCircularQueueIsFull(obj)){return false;}obj->a[obj->tail++] = value;obj->tail %= obj->k + 1;return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj)){return false;}obj->head++;obj->head %= obj->k + 1;return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj)){return -1;}return obj->a[obj->head];
}int myCircularQueueRear(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj)){return -1;}return obj->a[(obj->tail - 1 + obj->k + 1) % (obj->k + 1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

💥10、判断二叉树是否是完全二叉树

  • 牛客——判断是不是完全二叉树

在这里插入图片描述

层序遍历二叉树,当某次pop到非节点时不再入节点,然后不断pop如果是完全二叉树,则pop到的全是非节点;如果是非完全二叉树,则某次会pop到节点。

完全二叉树:
在这里插入图片描述
非完全二叉树:
在这里插入图片描述

class Solution {
public:bool isCompleteTree(TreeNode* root) {// write code hereif (root == nullptr){return true;}_qu.push(root);while (!_qu.empty()){TreeNode* front = _qu.front();_qu.pop();if (front == nullptr){break;}_qu.push(front->left);_qu.push(front->right);}while (!_qu.empty()){TreeNode* front = _qu.front();_qu.pop();if (front != nullptr){return false;}}return true;}
private:queue<TreeNode*> _qu;
};

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

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

相关文章

【Python进阶】学习Python必须要安装PyCharm。一篇文章带你总结一下安装PyCharm的注意事项,文末附带PyCharm激活码!!!

PyCharm激活码&#xff08;文末附带精品籽料&#xff09;&#xff1a; K384HW36OB-eyJsaWNlbnNlSWQiOiJLMzg0SFczNk9CIiwibGljZW5zZWVOYW1lIjoibWFvIHplZG9uZyIsImxpY2Vuc2VlVHlwZSI6IlBFUlNPTkFMIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdG…

代码随想录算法训练营day58:图论08:拓扑排序精讲;dijkstra(朴素版)精讲

拓扑排序精讲 卡码网&#xff1a;117. 软件构建(opens new window) 题目描述&#xff1a; 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依…

Unity 动态光照贴图,加载后显示变暗或者变白问题 ReflectionProbe的使用

动态加载光照贴图代码&#xff0c;可参考这个帖子 Unity 预制动态绑定光照贴图遇到变白问题_unity urp 动态加载光照信息 变黑-CSDN博客 这次遇到的问题是&#xff0c;在编辑器下光照贴图能正常显示&#xff0c;打出apk后光照贴图加载后变黑的问题 以下4张图代表4种状态&…

计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

MATLAB生成mif文件

MATLAB代码 % 参数设置 N 4096; % 数据点数量 t linspace(0, 2*pi, N); % 时间向量 width 12; % 位宽% 正弦波 sine_wave 2.5 * sin(t) 2.5; % 幅度在0到5之间% 三角波 tri_wave 5 - abs(mod(t/(2*pi)*4, 2) - 1);% 方波 square_wave 2.5 * (square(t) 1); % 将范围调…

安嘉空间:智慧科技守护空间健康

在当今社会&#xff0c;随着人们对生活质量要求的不断提升&#xff0c;室内环境的健康与安全问题日益受到重视。安嘉空间&#xff0c;作为一家致力于人居健康空间技术研发的高科技企业&#xff0c;以其独创的技术和卓越的产品&#xff0c;为广大用户提供了一套全面的空间健康解…

VastBase——数据库参数调优

一、内存参数调优 数据库的复杂查询语句性能非常强的依赖于数据库系统内存的配置参数。数据库系统内存的配置参数主要包括逻辑内存管理的控制参数和执行算子是否下盘的参数&#xff1a; 1.逻辑内存管理参数&#xff1a;max_process_memory max_process_memory – shared memo…

STM32 - 笔记3

1 开发有基于寄存器和HAL库 在开发 STM32 系列微控制器时&#xff0c;你可以选择基于寄存器的开发方法或使用 STM32 HAL&#xff08;硬件抽象层&#xff09;库进行开发。两者各有优缺点&#xff0c;适用于不同的场景和开发需求。下面详细介绍两种方法的特点、使用场景以及示例…

五、实现随机地图

一、创建场景 拖拽层级面板&#xff0c;删除摄像机 二、使用Addressable 给场景设置碰撞器 三、场景切换 场景中增加一个数据集合选择场景 四、字典 1、作用 根据列表中的RoomType查找数据 创建一个RoomDataSO的列表&#xff1b;创建一个字典&#xff0c;匹配房间类型和数据…

安装MySQL,navicat以及Django配置遇到的一些问题

MySQL安装问题 安装MySQL按照了此文章&#xff1a; MySQL数据库下载及安装教程&#xff08;最最新版&#xff09;_mysql下载安装-CSDN博客https://blog.csdn.net/weixin_39289696/article/details/128850498首先是遇到了starting the server红色叉号显示 按照上面文章的介绍…

故障诊断 | 基于小波时频图与Swin Transformer的轴承故障诊断方法(PyTorch)

文章目录 文章概述程序设计参考资料文章概述 基于小波时频图与Swin Transformer的轴承故障诊断方法 针对用传统的故障诊断方法难以对非线性非平稳的柴油机故障信号进行准确高效诊断的问题, 提出基于小波时频图与Swin Transformer的故障诊断方法。该方法可以有效结合小波时频分…

Luma AI,让你的视频像电影一样精彩!附带使用教程

Luma AI&#xff0c;让你的视频像电影一样精彩&#xff01;附带使用教程 随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的…

二叉树详解(进阶)

目录 1. 二叉搜索树 1.1 基本概念 1.2 基本操作 1.3 性能分析 1.4 键值对 2. AVL树和红黑树 2.1 AVL树 2.2 红黑树 3. 红黑树模拟实现STL中的map与set 1. 二叉搜索树 1.1 基本概念 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff1a…

Tomcat多实例部署

文章目录 Tomcat多实例部署一、安装好 jdk1.1设置JDK环境变量 image-20240820142906811二、安装 tomcat2.1配置 tomcat 环境变量2.2修改 tomcat2 中的 server.xml 文件2.3修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件&#xff0c;添加 tomcat 环境变量2.4启动各 tom…

【学习笔记】卫星通信发展趋势

卫星通信系统是融合现代通信技术、航天技术与计算机技术的综合应用&#xff0c;已成为国际与国内通信、国防、移动通信及广播电视领域的关键基础设施。基于其频带宽度大、通信容量高、业务兼容性强、覆盖范围广、性能稳定、地理条件适应性高及成本与距离无关等特性&#xff0c;…

uniapp scroll-view滚动触底加载 height高度自适应

背景&#xff1a; scroll-view组件是使用&#xff0c;官网说必须给一个高度height&#xff0c;否则无法滚动&#xff0c;所以刚开始设置了<scroll-view :style"height: 94vh" :scroll-y"true">设置了一个高度&#xff0c;想着vh应该挺合适的&#xf…

PhpStorm2024版设置自动换行(软换行)

Settings > Editor > General > Soft Wraps 选中并加上对应的文件

面试SQL题的水到底有多深?一文带你揭晓

不谋万世者&#xff0c;不足谋一时&#xff1b;不谋全局者&#xff0c;不足谋一域 目录 0 面试现状 1 面试SQL题目的难度及特点 1.1 题目场景化 1.2 题目算法化 1.3 方法多元化 2 破局之道 3 总结 数字化建设通关指南 主要内容&#xff1a; &#xff08;1&#xff09;SQL进阶实…

四、监控搭建-Prometheus-采集端批量部署

四、监控搭建-Prometheus-采集端批量部署 1、背景2、目标3、传承4、操作4.1、准备部署工具4.2、编制部署脚本4.3、服务端添加客户端 1、背景 在前三篇中我们搭建了Prometheus平台&#xff0c;采集端部署和配合图形化grafana部署&#xff0c;将Linux主机进行监控。基本完成了一…

『功能项目』怪物反击主角复活【14】

本章项目视频展示 当前文章成果展示 我们打开上一篇13技能爆炸与伤害数值显示的项目&#xff0c; 新建一个脚本InfoSystem.cs 新建一个游戏管理器GameManager.cs 在场景中创建一个空物体命名为GameManager 将GameManager.cs脚本挂载至空物体GameManager对象身上 增添PlayerRayC…