每日博客Day8
每日博客Day 8
每日算法
206.翻转链表
个人第一次思路: 其实我个人的第一个思路是比较暴力的,我第一遍暴力遍历链表,把链表的所有数值全部都保存到数组里面,然后翻转这个数组,再重复的覆盖当前的这个链表。但是这样子的实现方式实在是太暴力了,没有什么必要。
算法思路(双指针):
- 定义cur指针指向头结点,定义pre指针指向null(定义节点)
- 开始移动:先保存cur->next的节点为temp,不然后面不会丢失
- 往后面移动pre和cur指针,如果cur为NULL了,说明到了最后的位置,返回pre节点
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* pre = nullptr;ListNode* cur = head; ListNode* temp{};while (cur != nullptr){temp = cur->next;cur->next = pre;pre = cur;cur = temp;}delete temp;return pre;}
};
递归法:
其实对于我个人来说,我感觉递归如果理解了还是很容易的,但是有时候如果不理解他的结束条件和初始化的设置的话,还是感觉一下子不能明白。这个题目的递归相对来说还是挺容易一下子就理解的,递归就是反复去执行相同的操作。
下面的代码还是可以更加的简洁的,比如传入的变量的设置。
class Solution {
public:ListNode* reverse(ListNode* pre, ListNode* cur){//递归就反复的执行同一个步骤if (cur == nullptr) return pre;ListNode* temp = cur->next;cur->next = pre;/* pre = cur;cur = temp;*///递归其实就是做了上面这两步,可以自己画图去理解一下return reverse(cur, temp);}ListNode* reverseList(ListNode* head) {ListNode* pre = nullptr;ListNode* cur = head;return reverse(pre, cur);}
};
24. 两两交换链表中的节点
代码思路:使用虚拟头结点的方式去解决
一共分成了四步骤来走
class Solution
{
public:ListNode* swapPairs(ListNode* head) {//使用虚拟头结点的方式ListNode* dummyHead = new ListNode();dummyHead->next = head;ListNode* cur = dummyHead; //cur节点先指向虚拟头节点//循环结束的终止条件while (cur->next != nullptr && cur->next->next != nullptr){//先保存我们之后要改变节点的指向,防止节点丢失ListNode* temp = cur->next;ListNode* temp2 = cur->next->next->next;cur->next = cur->next->next; //步骤1cur->next->next = temp; //步骤2cur->next->next->next = temp2; //步骤3//4. 移动cur指针cur= cur->next->next;}return dummyHead->next;}
};
删除链表倒数的第N个节点
我第一次想到的解决方案,其实感觉也还是很暴力啊,而且还不能通过
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {int count = 0;ListNode* cur = head;while (cur->next!=NULL){count++;cur = cur->next;}int Index = count - n - 1;while (Index--){cur = cur->next;}ListNode* temp = cur->next;cur->next = temp->next;delete temp;return head;}
}
双指针解法
其实这个题目用双指针的话真的还是挺方便的,而且我感觉还挺很简单的啊,但是自己为什么最开始的就想起来要用双指针啊!!
这个代码写起来运行的时候还是有问题的:有两个特殊情况是我最开始没有考虑到的
- 如果要删除的链表中只有一个元素怎么处理?
我直接增加了对一个元素的判断,但是还是不可以通过,想到的问题就是
- 如果要删除的元素是链表的头节点,该怎么处理?
在这里如果使用虚拟头节点的方式来处理,真的就简单了,如果不用的话,要对很多特殊情况都做一个考虑说明,代码太复杂了,没必要这样子折磨我自己,啊哈哈哈哈
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {if ( n == 0 || head == nullptr ) return head;if(head->next == nullptr && n == 1) return nullptr;ListNode* Slow = head;ListNode* Fast = head;while (n-- && Fast != nullptr){Fast = Fast->next;}while (Fast->next != nullptr){Fast = Fast->next;Slow = Slow->next;}ListNode* temp = Slow->next;Slow->next = Slow->next->next;delete temp;return head;}
};
19 双指针和虚拟头节点做法
这一次终于通过了!!呜呜呜!!
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {if ( n == 0 || head==nullptr ) return head;ListNode* dummyHead = new ListNode();dummyHead->next = head;ListNode* Slow = dummyHead;ListNode* Fast = dummyHead;while (n--){Fast = Fast->next;}while (Fast->next != nullptr){Fast = Fast->next;Slow = Slow->next;}Slow->next = Slow->next->next;return dummyHead->next;}
};
面试题 02.07. 链表相交
在这里其实要思考的问题就是如何同步,也是使用的是双指针的方式去解决
双指针解法
这是我第一遍自己写的题解,我不知道哪里有问题啊,能跑过18个案例了,我寻思这个也没什么特殊情况要考虑的吧?
class Solution {
public:ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {if (headA == nullptr || headB == nullptr) return nullptr;ListNode* PointA = headA;ListNode* PointB = headB;int countA = 0;int countB = 0;while (PointA != nullptr){countA++;PointA = PointA->next;}while (PointB != nullptr){countB++;PointB = PointB->next;}PointA = headA;PointB = headB;//减去差值,然后移动A或者Bint num = 0;if (countA >= countB){num = countA - countB;while (num){num--;PointA = PointA->next;}while (PointA!=nullptr || PointB != PointA){PointA = PointA->next;PointB = PointB->next;}return PointA;}else {num = countB - countA;while (num){num--;PointB = PointB->next;}while (PointA != nullptr || PointB != PointA){PointA = PointA->next;PointB = PointB->next;}return PointA;}return PointA;}
};
稍微修改了一些细节,然后检查了一下就通过了
class Solution {
public:ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {if (headA == nullptr || headB == nullptr) return nullptr;ListNode* PointA = headA;ListNode* PointB = headB;int countA = 0;int countB = 0;while (PointA != nullptr){countA++;PointA = PointA->next;}while (PointB != nullptr){countB++;PointB = PointB->next;}PointA = headA;PointB = headB;//减去差值,然后移动A或者Bif (countA < countB){//交换可以统一后面判断的标准swap(countA, countB);swap(PointA, PointB);}int num = countA - countB;while (num--) PointA = PointA->next;while (PointA != nullptr){if (PointA == PointB) return PointA;PointA = PointA->next;PointB = PointB->next;}return nullptr;}
};
原来的代码修改了一下逻辑,但是说实话一个swap交换下,可以减少后面这里的很多判断
class Solution {
public:ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {if (headA == nullptr || headB == nullptr) return nullptr;ListNode* PointA = headA;ListNode* PointB = headB;int countA = 0;int countB = 0;while (PointA != nullptr){countA++;PointA = PointA->next;}while (PointB != nullptr){countB++;PointB = PointB->next;}PointA = headA;PointB = headB;//减去差值,然后移动A或者Bif (countA < countB){//交换可以统一后面判断的标准swap(countA, countB);swap(PointA, PointB);}int num = countA - countB;while (num--) PointA = PointA->next;while (PointA != nullptr){if (PointA == PointB) return PointA;PointA = PointA->next;PointB = PointB->next;}return nullptr;}
};
项目进度
添加IP地址和端口控件
通过添加了两个控件,一个初始化的时候传入IP地址一个初始化的时候传入端口的地址。
修改InitSocket函数,传入IP地址和端口
程序在运行的时候出现了链接不上的问题,原因是在于网络传输的字节序是有问题的,在网络中传输字节序的时候要多注意
文件树控件和获取驱动信息功能
size_t len = recv(m_sock, buffer + index, BUFFER_SIZE - index, 0);
//服务端必须要发送xiao'xiCServSocket::GetInstance()->Send(pack);
调试的时候发现这个len是0,表明客户端没有接收到来自服务端发送的消息信息
面试题目
只是看了书,没有做笔记,明天再做把。。。。
设计模式
了解了一下C++设计模式中的类图的内容,描述类与类之间的关系
单例设计模式:
最近在写的这个远程控制的项目就是采用的单例设计模式的思想
单例设计经常被使用到,是一种比较重要的设计模式,需要熟练的掌握
在应用系统开发中,我们常常有以下需求:
1.需要生成唯一序列的环境
2.需要频繁实例化然后销毁的对象。
3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
4.方便资源相互通信的环境
实际案例:
- 多线程中网络资源初始化
- 回收站机制
- 任务管理器
- 应用程序日志管理
- …
单列设计模式的实现步骤
- 构造函数私有化
- 提供一个全局的静态方法,访问唯一对象
- 类中定义一个静态指针,指向唯一对象
懒汉式代码
class Single
{
public:static Single* GetInstance()//2. 提供一个全局的静态方法,访问唯一的对象{if (m_single == nullptr){m_single = new Single;}return m_single;}void Print(){std::cout << "This is Print Func" << char(10);}
private:static Single* m_single;//3. 类中定义一个静态的指针,指向唯一的对象Single(){std::cout << "This is Single()" << char(10);m_single = nullptr;} //1. 构造函数私有化
};Single* Single::m_single = nullptr; //初始化操作
int main()
{//虽然构造函数是不可以被调用了的,但是可以声明指向这个类的指针Single* P1 = Single::GetInstance();Single* P2 = Single::GetInstance();P1->Print();P2->Print();std::cout << hex << P1 << char(10);std::cout << hex << P2 << char(10);return 0;
}
饿汉式代码
饿汉式代码其实就是在类外静态指针初始化的时候直接去new申请了内存空间,这样我们在不需要再GetInstance中去判断初始化操作了
整体的效果和懒汉式是一样的,但是实现的思想是不同的。
饿汉式可能会出现多线程对资源争夺的问题,在日后的学习中心需要多多注意这方面的内容
class Single
{
public:static Single* GetInstance()//2. 提供一个全局的静态方法,访问唯一的对象{//if (m_single == nullptr)//{// m_single = new Single;//}return m_single;}void Print(){std::cout << "This is Print Func" << char(10);}
private:static Single* m_single;//3. 类中定义一个静态的指针,指向唯一的对象Single(){std::cout << "This is Single()" << char(10);m_single = nullptr;} //1. 构造函数私有化
};Single* Single::m_single = new Single; //初始化操作
int main()
{//虽然构造函数是不可以被调用了的,但是可以声明指向这个类的指针Single* P1 = Single::GetInstance();Single* P2 = Single::GetInstance();P1->Print();P2->Print();std::cout << hex << P1 << char(10);std::cout << hex << P2 << char(10);return 0;
}
相关文章:
每日博客Day8
每日博客Day 8 每日算法 206.翻转链表 个人第一次思路: 其实我个人的第一个思路是比较暴力的,我第一遍暴力遍历链表,把链表的所有数值全部都保存到数组里面,然后翻转这个数组,再重复的覆盖当前的这个链表。但是这样…...
Redis-主从与哨兵架构
Jedis使用 Jedis连接代码示例: 1、引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version> </dependency> 2、访问代码 public class JedisSingleTe…...
PTA 7-3 将数组中的数逆序存放
本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。 输入格式: 输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。 输出格式:…...
JavaScript 如何拷贝对像(Object)或者数组(Array)
目录 JavaScript数据拷贝类型 浅拷贝 深拷贝 举例: 浅拷贝 数组 对象 深拷贝 lodash cloneDeep使用示例 自定义深拷贝方法示例 JSON.parse() 和 JSON.stringify()使用示例 JavaScript数据拷贝类型 浅拷贝 数组可以使用Array.prototype.slice()方法 …...
nodejs669在线图书借阅管理系统vue前端
系统的设计与实现主要实现角色有管理员和用户,管理员在后台管理用户模块、用户表模块、图书借阅模块、图书归还模块、图书分类模块、token表模块、收藏表模块、书籍信息模块、图书资讯模块、留言板模块、书籍信息评论表模块、注册用户模块、配置文件模块、处罚记录模块、在线客…...
计算机网络之概述
一、概述 1.1因特网概述 定义 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即互联网(或互连网)因此,互联网是“网络的网络…...
git stash save untracked not staged
git stash save untracked not staged 如图 解决方案: git stash save "tag标记信息" --include-untracked或者: git stash save -u "tag标记信息" git stash clear清空本地暂存代码_zhangphil的博客-CSDN博客文章浏览阅读486次。…...
spring-boot集成mybatis-generator
通用 Mapper 在 1.0.0 版本的时候增加了 MyBatis Generator (以下简称 MBG) 插件,使用该插件可以很方便的生成实体类、Mapper 接口以及对应的 XML 文件。 下面介绍了 mybatis-generator 在 spring-boot 中的使用过程 一、引入pom依赖 <dependencies><de…...
C++中用于动态内存的new和delete操作符
文章目录 1、动态分配内存的应用2、动态分配内存与分配给普通变量的内存有什么不同?3、C 中如何分配/释放内存4、new 操作符4.1 使用new的语法4.2 初始化内存4.3 分配内存块4.4 普通数组声明 Vs 使用new4.5 如果运行时没有足够内存可用怎么办? 5、delete 操作符 C/…...
什么是美颜sdk?集成第三方美颜sdk的步骤
本文将深入探讨如何集成第三方美颜sdk,为直播平台引入更先进、更具吸引力的美颜特效。 第一步:选择合适的第三方美颜sdk 在开始集成美颜sdk之前,首要任务是选择适合自己直播平台需求的第三方美颜sdk。不同的sdk可能具有不同的特色和性能&a…...
Gogs服务搭建及软件的使用
Gogs基本操作使用:https://blog.51cto.com/yangxingzhen/5980346 Gitea—私有git服务器搭建教程:https://huaweicloud.csdn.net/638db200dacf622b8df8c7f1.html?spm1001.2101.3001.6650.3&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTR…...
Python基础语法之学习运算符
Python基础语法之学习运算符 一、代码二、效果 一、代码 print("1 1 ", 1 1) print("1 - 1 ", 1 - 1) print("1 * 1 ", 1 * 1) print("11 / 5 ", 11 / 5) print("11 // 5 ", 11 // 5) print("9 % 5 ", 9…...
freertos任务调度机制深度分析(以RISC-V架构为例)
1、前言 本文是以RISC-V架构为例进行讲解,在汇编代码层面和ARM架构不一样,但是整体框架是一样的侧重任务调度底层机制讲解,讲解代码只保留了基本功能,可配置的功能基本都已经删除本文是以可抢占式调度机制进行讲解RISC-V架构只支持…...
深入了解Spring Boot中@Async注解的8大坑点
文章目录 1. 缺少EnableAsync注解2. 异步方法需独立3. 不同的异步方法间无法相互调用4. 返回值为void的异步方法无法捕获异常5. 外部无法直接调用带有Async注解的方法6. Async方法不适用于private方法7. 缺失异步线程池配置8. 异步方法与事务的兼容结语 🎉深入了解S…...
C语言——深入理解指针(3)
目录 1. 字符指针 2. 数组指针 2.1 数组指针变量 2.2 数组指针变量的初始化 3.二维数组传参(本质) 4. 函数指针 4.1 函数指针变量的创建 4.2 函数指针的使用 4.3 typedef 5. 函数指针数组 6. 转移表(函数指针数组的使用ÿ…...
图书管理系统源码,图书管理系统开发,图书借阅系统源码配置和运行图解源码已附加
目录 配置简介和软件条件 数据库附件配置 vs应用程序web.config配置数据库链接字符串 数据库文件脚本代码 配置简介和软件条件 所需要的软件是Vs2017以上数据库是Sqlserver2012以上,如果数据库附件不了可以使用数据库脚本附件数据库脚本会在文章末尾写出来。可以…...
FFmpeg介绍
官方网站:http://www.ffmpeg.org/ 项目组成 libavformat 封装模块,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的。FFmpeg能否支持一种封装格式的视频的封装与解封装,完全取决于这个库,…...
修改网卡PHY的灯-RK3568
文章目录 前言1.定制PHY的灯2.通过命令修改LED状态3.修改驱动效果前言 前面我们已经移植了网卡到开发板上面,也能够正常的进行通信,但是,我们会发现座子上面的灯并没有全部亮起来,而且这些灯的含义是什么,并没有讲解到,这里,就此问题,展开学习。 PHY 有一个重要的功能…...
11月29日作业
作业: 自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height), 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show(…...
【从删库到跑路 | MySQL总结篇】表的增删查改(进阶下)
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、联合…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
