【刷题汇总 -- 删除公共字符、两个链表的第一个公共结点、mari和shiny】

C++日常刷题积累

  • 今日刷题汇总 - day012
    • 1、删除公共字符
      • 1.1、题目
      • 1.2、思路
      • 1.3、程序实现 -- 蛮力法
      • 1.4、程序实现 -- 哈希
    • 2、两个链表的第一个公共结点
      • 2.1、题目
      • 2.2、思路
      • 2.3、程序实现 -- 对齐比对法
      • 2.4、程序实现 -- 公共端点路程法
    • 3、mari和shiny
      • 3.1、题目
      • 3.2、思路
      • 3.3、程序实现
      • 3.4、程序实现 -- 空间优化
    • 4、题目链接

今日刷题汇总 - day012

1、删除公共字符

1.1、题目

在这里插入图片描述

1.2、思路

读完题知道,输入两个字符串str1和str2,然后去除str1中与str2相关的字符,输出即可。那么蛮力法思路,可以遍历str1,再套一层遍历str2,判断字符是否相同,不相同则尾插到retstr中,最后输出即可。还可以进行优化,可以采用hash表标记str2中的字符,然后就只需要遍历一遍str1字符,如果在hash中已经存在,那么就是相同字符,不存在那么就尾插到retstr中即可,最后输出即可。那么,接下来就是程序实现。

1.3、程序实现 – 蛮力法

根据思路的蛮力法,挨着挨着遍历比较即可。注意控制边界和尾插条件即可。可以简化思路,使用标志位flag也可以处理。

#include <iostream>
#include <string>
using namespace std;int main()
{string str1;string str2;getline(cin, str1);getline(cin, str2);string retstr;size_t len1 = str1.size();size_t len2 = str2.size();for(int i = 0;i < len1; i++){for(int j = 0;j < len2; j++){if (str1[i] == str2[j])break;else if((str1[i] != str2[j]) && (j == len2-1)){retstr += str1[i];  }}   }cout << retstr << endl;return 0;
}

在这里插入图片描述
利用标志位简化逻辑控制判断,但注意标志位每一次遍历前都置0.

#include <iostream>
#include <string>
using namespace std;int main()
{string str1;string str2;getline(cin, str1);getline(cin, str2);string retstr;size_t len1 = str1.size();size_t len2 = str2.size();int flag = 0;for(int i = 0;i < len1; i++){flag = 0;for(int j = 0;j < len2; j++){if(str1[i] == str2[j]){flag = 1;break;}}if(!flag)retstr += str1[i];        }cout << retstr << endl;return 0;
}

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

1.4、程序实现 – 哈希

利用哈希表标记一下str2的字符,只需要遍历一遍str1如果不存在就尾插到retstr最后输出即可。
另外,由于此提示ACM题型,可以单独输出每个字符,不用开辟retstr额外的空间。那么两个都写一写吧。

#include <iostream>
#include <string>
using namespace std;int main()
{bool hash[300] = { false };string str1;string str2;string retstr;getline(cin,str1);getline(cin,str2);size_t len1 = str1.size();size_t len2 = str2.size();for(int i = 0;i < len2; i++)hash[str2[i]] = true;for(int i = 0;i < len1;i++){if(!hash[str1[i]])retstr += str1[i];}cout << retstr << endl;return 0;
}

在这里插入图片描述

也可以不用尾插,直接用范围for判断一个字符就直接输出单个字符,直到结束遍历即可。

#include <iostream>
#include <string>
using namespace std;int main()
{bool hash[300] = { false };string str1;string str2;getline(cin,str1);getline(cin,str2);size_t len1 = str1.size();size_t len2 = str2.size();for(auto ch : str2)hash[ch] = true;for(auto ch : str1){if(!hash[ch])cout << ch;}return 0;
}

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

2、两个链表的第一个公共结点

2.1、题目

在这里插入图片描述

2.2、思路

读完题,知道是之前学数据结构链表章节做过的类似题目,这里要求两个单链表的第一个相遇的公共端点,有则返回该端点,无则返回NULL即可。根据题目和示例分析,输入分为三部分,可以想到两种解题思路。借助之前数据结构的思路思考得出第一种解题思路,这里为了方便描述,个人取名为“对齐比对法”,意思就是将两个链表对齐,将较长的链表去除多余的非公共部分,达到与第二个链表对齐的效果,再一起利用cur1和cur2同时遍历两个链表,当cue1 和 cur2 且 cur1->val 与 cur2->val都指向且等于同一个结点时,那么这个结点就是第一个公共结点。
第二种思路,学习大佬的解题思路秒不可言,这里我称为“公共端点路程法”,我理解的思路也是需要利用两个指针,分别从两个链表同时遍历,各自的非公共部分 + 公共部分 + 对方的非公共部分,遍历结束的位置就是第一个公共端点的位置。
综上所述,两个思路都挺简单的,但是为了更清晰的理解,画个图:
在这里插入图片描述
在这里插入图片描述
根据思路分析,方法一需要解决以下几个问题:
(1)、如何去除较长单链表的非公共部分;
(2)、如何确定两个指针cur1和cur2对齐;
(3)、能否处理题目示例2中,公共端点为空的情况?
思考后解决思路:
(1)、可以这样理解,先用cur1和cur2指针遍历一遍各自的单链表,当一个指针如cur2遍历完指向NULL时,暂停cur1的遍历,此时利用一个计数器如count++,再继续执行cur1的遍历,直到cur1遍历到NULL结束。那么此时就可以得出两个结果,一个是先遍历完的是较短的单链表,第二个是后遍历完的链表的count就是它们之间的差值,把差值拿到较长链表的开头进行去除,就能实现去除多余的非公共部分结点。
(2)、基于(1)的基础上,置去除结点之后的这个结点为cur1与较短单链表的开头结点为cur2即可对齐。
(3)、其实不管是方法一“对齐比对法”还是方法二“公共端点路程法”都已经兼容了,处理为空的情况。因为遍历完本身没有公共点就是为NULL,那么自然而然就返回NULL。可以画个图,简单看一下就很清楚了哈。这里我就不详细演示了:
在这里插入图片描述
那么接下来,就是程序实现。

2.3、程序实现 – 对齐比对法

综上所述,总结后基本分为以下几个步骤:
(1)、计算两个链表的长度和差值;
(2)、头删较长单链表;
(3)、同步两个链表的指针,同时遍历;
思路写得很详细了,是好理解简单的,程序就细心一点就可以了。值得再提一提的就是头删后更新一下cur1和cur2以及执行while遍历的条件即可。

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2){int count = 0;int len1 = 0;int len2 = 0;ListNode* cur1 = pHead1;ListNode* cur2 = pHead2;//计算差值while(cur1){len1++;cur1 = cur1->next;}while(cur2){len2++;cur2 = cur2->next;}count = abs(len1 - len2);//头删较长单链表if(len1 >= len2){while(count--){pHead1 = pHead1->next;}//同步两个链表的指针,同时遍历cur1 = pHead1;cur2 = pHead2;while(cur1 != cur2 && cur1->val != cur2->val){cur1 = cur1->next;cur2 = cur2->next;}}else{while(count--){pHead2 = pHead2->next;}//同步两个链表的指针,同时遍历cur1 = pHead1;cur2 = pHead2;while(cur1 != cur2 && cur1->val != cur2->val){cur1 = cur1->next;cur2 = cur2->next;}}return cur1;}
};

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

2.4、程序实现 – 公共端点路程法

接着,总结思路分析,主要可以分为以下几个步骤:
(1)、定义工作指针,分别指向两个单链表;
(2)、严格按照思路分析的顺序,遍历单链表;
(3)、遍历结束就是结果的公共端点。

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {ListNode* cur1 = pHead1;ListNode* cur2 = pHead2;while(cur1 != cur2){cur1 = cur1 != NULL ? cur1->next : pHead1;cur2 = cur2 != NULL ? cur2->next : pHead2;}return cur1;}
};

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

3、mari和shiny

3.1、题目

在这里插入图片描述

3.2、思路

读完题,知道让求一段仅由小写字母组成的字符串中,有多少个子序列"shy"。其中,根据示例得知,这段字符串的“‘s’,‘h’,‘y’”不一定是连续的,可自由组成子序列"shy",最后求最后能拼接多少个子序列"shy"。那么,分析示例和思考,每一个’s’ 、‘h’、'y’都可以不重复的任意拼接。可知"shy"由"sh"和‘y’决定,而"sh’由‘s’和‘h’决定。那么结合多状态的线性dp动态规划的思路或者分治法的思想,划分为若干个子问题求解。那么继续思考dp的状态表示和状态转移方程,为了方便理解,画个图:
在这里插入图片描述
接着考虑舒适化各个dp[i]的第一个元素,同样需要判断是否就是‘s’ 或 ‘h’ 或 ‘y’,是则置1否则置0完成初始化即可。接下来,就是程序实现。

3.3、程序实现

首先,根据题目要求写好输入,且注意范围这里使用long long防止越界,然后就可以定义多状态的dp数组,即s(len, 0), h(len, 0), y(len, 0)即可,然后初始化dp的第一个元素,然后就是分析的状态转移方程思路,遍历判断各个字符再累加个数,最终得到y[len-1]就是长度为n最多子序列"shy"的个数输出即可。

#include <iostream>  
#include <string>  
#include <vector> using namespace std;  int main() {  long long n;cin >> n;  string str;  cin >> str;  size_t len = str.size();  vector<long long> s(len, 0), h(len, 0), y(len, 0); // 初始化第一个元素  s[0] = (str[0] == 's') ? 1 : 0;  h[0] = (str[0] == 'h' && s[0] > 0) ? 1 : 0;  y[0] = (str[0] == 'y' && h[0] > 0) ? 1 : 0;  for (size_t i = 1; i < len; i++){  if (str[i] == 's'){  s[i] = s[i-1] + 1;  } else{  s[i] = s[i-1];  }  if (str[i] == 'h'){  h[i] = h[i-1] + s[i-1];  }else{  h[i] = h[i-1];  }  if (str[i] == 'y'){  y[i] = y[i-1] + h[i-1];  } else {  y[i] = y[i-1];  }  }  cout << y[len-1] << endl;  return 0;  
}

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

3.4、程序实现 – 空间优化

进一步思考,发现可以控制三个变量代替各个dp来表示’s’ 和 ‘h’ 以及 'y’的个数,实现空间的优化。并且这种写法兼容了[0,i-1]区间内str[i] != ‘s’ 或 ‘h’ 或 'y’的情况,达成此题的最优解法。

#include <iostream>
#include <string>using namespace std;int main()
{int n = 0;cin >> n;string str;cin >> str;long long s = 0, h = 0, y = 0;for(int i = 0;i < n; i++){char ch = str[i];if(ch == 's') s++;else if(ch == 'h')h += s;else if(ch == 'y')y += h;}cout << y << endl;return 0;
}

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

4、题目链接

删除公共字符
两个链表的第一个公共结点
mari和shiny

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

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

相关文章

[python]基于yolov10+gradio目标检测演示系统设计

【设计介绍】 YOLOv10结合Gradio实现目标检测系统设计是一个结合了最新目标检测技术和快速部署框架的项目。下面将详细介绍这一系统的设计和实现过程。 一、YOLOv10介绍 YOLOv10是YOLO&#xff08;You Only Look Once&#xff09;系列的最新版本&#xff0c;由清华大学的研究…

vienna整流器的矢量分析

Vienna整流器使用六个二极管和六个IGBT&#xff08;或MOSFET&#xff09;组成&#xff0c;提供三个电平&#xff1a;正极电平&#xff08;P&#xff09;、中性点电平&#xff08;O&#xff09;和负极电平&#xff08;N&#xff09;。通过对功率管的控制&#xff0c;Vienna整流器…

Telegram Bot、小程序开发(一)基础入门

文章目录 一、Telegram Bot是什么&#xff1f;二、Telegram Bot应用场景三、机器人是如何工作的&#xff1f;架构getUpdates 和 webhookswebhooks要求自签名证书 四、如何创建和使用Telegram Bot&#xff1f;整体步骤和流程Bot 的申请过程将机器人添加到 Telegram 群组 一、Tel…

昇思25天打卡营第25天|基于MoblieNetv2的垃圾分类

一、简介&#xff1a; 本次实验主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 实验目的&#xff1a; 了解熟悉垃圾分类应用代码的编写&#xff08;Python语言&#x…

卷积神经网络——LeNet——FashionMNIST

目录 一、文件结构二、model.py三、model_train.py四、model_test.py 一、文件结构 二、model.py import torch from torch import nn from torchsummary import summaryclass LeNet(nn.Module):def __init__(self):super(LeNet,self).__init__()self.c1 nn.Conv2d(in_channe…

Autosar Dcm配置-0x28服务ComControl-基于ETAS软件

文章目录 前言DcmDcmDsdDcmDspBswMBswMModeRequestPortBswMModeConditionBswMLogicalExpressionBswMActionBswMActionListBswMRule总结前言 0x28服务主要用来控制非诊断报文的通讯,一般在刷写预编程过程中,用来禁止APP的通信报文,可以减少总线负载率,提高刷写成功率。本文…

[C++] STL :stackqueue详解 及 模拟实现

标题&#xff1a;[C] STL &#xff1a;stack&&queue详解 水墨不写bug 目录 &#xff08;一&#xff09;stack简介 &#xff08;二&#xff09;queue简介 &#xff08;三&#xff09;容器适配器 &#xff08;四&#xff09;stack和queue的模拟实现 /*** …

数据结构(初阶1.复杂度)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度&#xff1f; 2.2.2.// 计算Func3的时间复杂度&#xff1f; 2.2.3.// 计算Func4的时间复杂度&#xff1f; 2.2.4.// 计算strchr的时间复杂度&#xff1f; …

构造者模式的实现

引言——构造复杂对象的艺术 软件工程中&#xff0c;构造复杂对象的艺术被巧妙地封装在构造者模式&#xff08;Builder Pattern&#xff09;中。这种设计模式不仅提供了一种清晰且灵活的方式来构建复杂对象&#xff0c;还使得代码更具可读性和可维护性。构造者模式的核心思想是…

Unity最新第三方开源插件《Stateful Component》管理中大型项目MonoBehaviour各种序列化字段 ,的高级解决方案

上文提到了UIState, ObjectRefactor等,还提到了远古的NGUI, KBEngine-UI等 这个算是比较新的解决方法吧,但是抽象出来,问题还是这些个问题 所以你就说做游戏是不是先要解决这些问题? 而不是高大上的UiImage,DoozyUI等 Mono管理引用基本用法 ① 添加Stateful Component …

安全测试理论

安全测试理论 什么是安全测试&#xff1f; 安全测试&#xff1a;发现系统安全隐患的过程安全测试与传统测试区别 传统测试&#xff1a;发现bug为目的 安全测试&#xff1a;发现系统安全隐患什么是渗透测试 渗透测试&#xff1a;已成功入侵系统为目标的的攻击过程渗透测试与安全…

“好物”推荐+Xshell连接实例+使用Conda创建独立的Python环境

目录 主题&#xff1a;好易智算平台推荐RTX 4090DGPU实例租用演示安装配置torch1.9.1cuda11.1.1环境引言&#xff1a;算力的新时代平台介绍&#xff1a;技术与信任的结晶使用案例&#xff1a;实际使用展示创建实例开始使用连接实例&#xff08;下文演示使用Xshell连接&#xff…

昇思25天学习打卡营第二十天|基于MobileNetv2的垃圾分类

打卡营第二十天&#xff0c;今天学习的内容是MobileNet垃圾分类&#xff0c;记录一下学习内容&#xff1a; 学习内容 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中…

【ARM】CCI集成指导整理

目录 1.CCI集成流程 2.CCI功能集成指导 2.1CCI结构框图解释 Request concentrator Transaction tracker Read-data Network Write-data Network B-response Network 2.2 接口注意项 记录一下CCI500的ACE slave interface不支持的功能&#xff1a; 对于ACE-Lite slav…

基于信号处理的PPG信号滤波降噪方法(MATLAB)

光电容积脉搏波PPG信号结合相关算法可以用于人体生理参数检测&#xff0c;如血压、血氧饱和度等&#xff0c;但采集过程中极易受到噪声干扰&#xff0c;对于血压、血氧饱和度测量的准确性造成影响。随着当今社会医疗保健技术的发展&#xff0c;可穿戴监测设备对于PPG信号的质量…

简单的SQL字符型注入

目录 注入类型 判断字段数 确定回显点 查找数据库名 查找数据库表名 查询字段名 获取想要的数据 以sqli-labs靶场上的简单SQL注入为例 注入类型 判断是数字类型还是字符类型 常见的闭合方式 ?id1、?id1"、?id1)、?id1")等&#xff0c;大多都是单引号…

【ASTGCN】模型调试学习笔记--数据生成详解(超详细)

利用滑动窗口生成时间序列 原理图示&#xff1a; 以PEMS04数据集为例。 该数据集维度为&#xff1a;(16992,307,3)&#xff0c;16992表示时间序列的长度&#xff0c;307为探测器个数&#xff0c;即图的顶点个数&#xff0c;3为特征数&#xff0c;即流量&#xff0c;速度、平…

期权专题12:期权保证金和期权盈亏

目录 1. 期权保证金 1.1 计算逻辑 1.2 代码复现 1.3 实际案例 2. 期权盈亏 2.1 价格走势 2.2 计算公式 2.2.1 卖出期权 2.2.2 买入期权 免责声明&#xff1a;本文由作者参考相关资料&#xff0c;并结合自身实践和思考独立完成&#xff0c;对全文内容的准确性、完整性或…

[CISCN 2023 华北]normal_snake

[CISCN 2023 华北]normal_snake 源码和依赖 算了直接说吧&#xff0c;不想截图了&#xff0c;就多了一个C3P0和yaml的依赖 然后read路由可以反序列化yaml的Str 我们看到waf 那个String是可以二次反序列化绕过的,然后CUSTOM_STRING1解码后是"BadAttributeValuePairExcept…

【java】力扣 反转链表

力扣 206 链表反转 题目介绍 解法讲解 先定义两个游标indexnull&#xff0c;prenull&#xff0c;反转之后链表应该是5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1&#xff0c;我们先进行2->1的反转&#xff0c;然后再循坏即可 让定义的游标index去存储head.n…