【C++】 —— 笔试刷题day_18

article/2025/8/15 20:53:50

一、压缩字符串(一)

题目解析

在这里插入图片描述

题目给定一个字符str,让我们将这个字符串进行压缩;

**压缩规则:**出现多次的字符压缩成字符+数字;例如aaa压缩成a3。如果字符值出现一次,1不用写。

算法思路

这道题总的来说就非常简单了,我们直接模拟整个过程即可。

思路:

示例双指针遍历,统计字符和字符出现的次数;

i固定一个字符,j向后遍历找与i位置相同的字符,如果相同就继续向后遍历,直到j位置与i位置的字符不相同;

j向后遍历结束,i位置字符出现的字符次数为j-i;如果j-1大于1就在结果字符串中加入出现的次数;等于1则不用加次数。

代码实现

class Solution {
public:string compressString(string param) {string ret;for(int i =0;i<param.size();){int j = i+1;while(j<param.size() && param[j] == param[i])j++;ret+=param[i];if(j-i>1)ret+=to_string(j-i);i = j;}return ret;}
};

二、chika和蜜柑

题目解析

在这里插入图片描述

这道题说chika很喜欢吃蜜柑,每一个蜜柑有一定的甜度和酸度;

现在输入n表示蜜柑的个数,k表示chika要吃k个蜜柑;然后依次输入每个蜜柑的酸度、每个蜜柑的甜度。

chika想要甜度尽可能的大,如果存在甜度相等的情况,就让酸度尽可能小。

现在要我们求酸度和甜度(甜度尽可能大,酸度尽可能小)。

算法思路

对于这道题,是一道topK问题

不知是否对topK还有一些记忆,topK问题简单来说就是在一堆数据中寻找较大/较小k个数;

那对于我们这道题来说,我们要甜度尽可能大,那就是找甜度较大的k个数;但是,我们这道题在甜度相等的时候,要酸度尽可能小;

我们可以使用pair<int , int>类型来存储每一个蜜柑的甜度和酸度,但是我们要知道pair<int,int>的默认比较大小的方式:首先比较firstfirst大就大,first相等再看secondsecond大就大。

**但是我们这里要的比较方式是:**先比较甜度,甜度大就大;甜度相等再看酸度,酸度要尽可能小,而不是尽可能大。

那这里我们就要使用我们这里要求的比较方式,所以我们要自己实现一个可调用对象,这个可调用对象用来比较两个pair<int,int>类型的对象;

比较方式:

这里如果first不相等,就比较first;如果first相等比较second

这里我们可以排升序,也可以排降序(博主这里实现排降序的)

如果first不相等,就返回a.first > b.first;如果first相等,就比较second返回a.second < b.second

这样我们可调用对象返回的就是a是否大于b,排的就是降序。

代码实现

这里可调用对象可以写仿函数、也可以写lambda,这里就实现lambda

#include<iostream>
#include<algorithm>using namespace std;
const int N = 2e5+10;
int n,k;
typedef pair<int,int> PII;
PII arr[N];
int main()
{cin>>n>>k;for(int i = 0;i<n;i++)cin>>arr[i].second;for(int i = 0;i<n;i++)cin>>arr[i].first;//排序sort(arr,arr+n,[](PII& a,PII& b){if(a.first!=b.first)return a.first>b.first;elsereturn a.second<b.second;});long long a = 0, b = 0;for(int i = 0;i<k;i++){a+=arr[i].first;b+=arr[i].second;}cout<<b<<' '<<a<<endl;return 0;
}

三、01背包

题目解析

在这里插入图片描述

OK啊,这道题是一道经典的01背包问题;题目给定一个V表示背包的体积、n表示物品的个数、vw数组,其中vw[i][0]表示第i个物品的体积、vw[i][1]表示第i个物品的重量。

最后让我们返回从i个物品中选择体积不超过V的物品的最大重量。

算法思路

对于01背包问题呢,这道题并没有那么多弯弯绕绕

对于背包问题的结题思路,就是动态规划(线性dp)。

如果没有了解过动态规划,或者没有搞清楚动态规划中它状态表示的含义和动态转移方程,那这道题还是有点难度的。

状态表示:

dp[i][j] 表示在i个物品中选择体积不超过j的物品,这些物品重量的最大值。(背包容量为j,从i个物品中选择时的最大重量)。

状态转移方程:

对于i位置的物品,我们可以选择这个位置的物品,也可以不选择这个位置的物品;

  • 如果选择i位置时dp[i][j] = dp[i-1][j-v[i]] + v[i](其中v[i]表示i位置物品的重量);
  • 如果我们没有选择i位置:dp[i][j] = dp[i-1][j]

理解了状态表示和状态转移方程,这里在填写dp表示时还要注意:

在填表时,当我们的背包容量要大于物品i的体积,这时我们可以选择该物品;(这是我们才需要考虑是否选择该物品)

如果背包容量小于物品i的体积,这时我们就不能选择该物品。(这时我们就不用考虑是否选择该位置了)

在这里插入图片描述

空间优化:

这里我们使用的是一个二维dp表,我们可以进行一下优化;

简单来说就是使用一维dp表来解决,(在遍历i时,我们就可以认为此时在枚举在i个物品中选择体积不超过j的物品;那对于某一个物品,不选择它时的最大重量就等于此时的dp[j],选择它时的最大重量就等于dp[j - v[i]] + z[i]其中z[i]表示i物品的重量)。

那这样我们dp[i] = max(dp[i] , dp[j-v[i]] + z[i])

还要注意这样我们就需要从右往左填表,否则就会覆盖掉我们的数据。

代码实现

class Solution {
public:int dp[1001][1001] = {0};int knapsack(int V, int n, vector<vector<int> >& vw) {// write code herefor(int i = 1;i<=n;i++){for(int j = 1;j<=V;j++){if(vw[i-1][0] <= j){dp[i][j] = max(dp[i-1][j],dp[i-1][j-vw[i-1][0]]+vw[i-1][1]);}else {dp[i][j] = dp[i-1][j];}}}return dp[n][V];}
};

空间优化:

class Solution {
public:int dp[1001] = {0};int knapsack(int V, int n, vector<vector<int> >& vw) {// write code herefor(int i = 0;i<n;i++){for(int j = V;j>=vw[i][0];j--)dp[j] = max(dp[j],dp[j-vw[i][0]] + vw[i][1]);}return dp[V];}
};

到这里本篇文章就结束了,继续加油


http://www.hkcw.cn/article/rYXwkjBSCX.shtml

相关文章

谷歌浏览器如何禁用javaScript

通过禁用js&#xff0c;可以访问一些设置权限的内容。 Chrome 地址栏输入 chrome://settings/content 回车。 找到 JavaScript 选项。 切换为 不允许网站使用 JavaScript。 地址栏输入&#xff1a; chrome://settings/content/javascript?searchJavaScript Firefox 地址栏输入…

Java从入门到“放弃”(精通)之旅——类和对象全面解析⑦

Java从入门到“放弃”&#xff08;精通&#xff09;之旅&#x1f680;——类和对象全面解析⑦ 一、面向对象初探 1.1 什么是面向对象&#xff1f; Java是一门纯面向对象的语言(OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&am…

【Golang】第七弹----map

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 1基本介绍 Go语言中的 map …

C/C++程序员为什么要了解汇编?了解汇编有哪些好处?如何学习汇编?

目录 1、概述 2、从汇编的角度去理解问题的若干实例说明 2.1、使用空指针去访问类的数据成员或调用类的虚函数为什么会引发崩溃? 2.2、从汇编代码的角度去理解多线程的执行细节,去理解多线程在访问共享资源时为什么要加锁 2.3、使用Windbg静态分析dump时先从崩溃的那条汇…

基于谐波线性化方法的跟网型GFL并网变流器/VSC宽频序阻抗建模及扫频(Matlab/Simulink平台)及文献复现

目录 1、课程及模型介绍 2、谐波线性化方法介绍 3、跟网型及构网型并网变流器的特点 4、跟网型变流器/VSC拓扑及控制结构 5、不同坐标系下VSC序阻抗建模推导过程 5.1 abc三相坐标系下的VSC序阻抗建模 5.2 d-q旋转坐标系下的VSC序阻抗建模 5.2.1 Park变换及频率偏移效应…

C++“STL之String”

​ 🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:C++入门 目录 ​编辑 前言 一、STL简介 1.1 STL是什么? 1.2 STL的版本(这个不是很重要了解即可) 1.3 STL的六大组件 二、 String类 2.1为什么要学习String类? 2.1.1 C语言中的字符串…

C++之多态

开始新的征程啦———多态&#xff0c;它也是C的三大特性之一。 文章目录 一、多态的概念二、多态的定义和实现2.1多态的定义2.2 实现动态多态所需要的条件&#xff08;2个&#xff09;2.3 虚函数的定义2.4 虚函数的重写/覆盖2.5 虚函数重写中的问题2.5.1 协变2.5.2 析构函数的…

【第十六届蓝桥杯省赛】比赛心得与经验分享(PythonA 组)

文章目录 一、我的成绩二、我的备赛经历三、如何备赛&#xff08;个人观点&#xff09;1. 基础语法2. 数据结构3. 算法4. 数学 四、做题技巧与注意事项五、我的题解试题A 偏蓝 &#x1f3c6;100%试题B IPV6 &#x1f3c6;0%试题C 2025图形 &#x1f3c6;100%试题D 最大数字 &am…

21天Python计划:零障碍学语法(更新完毕)

文章目录 前言Python 部分MySQL 部分目录结语资料截图 前言 此技术博客专栏围绕 Python 编程和 MySQL 数据库展开了系统且循序渐进的知识讲解&#xff0c;共包含 21 篇文章。 Python 部分 从基础入门逐步深入到高级应用。首先介绍了 Python 的下载和开发工具&#xff0c;为后续…

JavaScript--js基础(详细 全面)

目录 前言: JavaScript 是什么&#xff1f;JavaScript 简介 1.JavaScript历史 2.JavaScript 具有以下特点 第一个JavaScript程序 1.在脚本文件中编写JavaScript代码 2.JavaScript代码执行顺序 基本语法 1.变量 2.数据类型 3.算术运算符 4.赋值运算 5.字符串运算符 6…

Java识别图片或扫描PDF中的文字

目录 使用工具 Java识别图片中的文字 Java识别扫描PDF中的文字 注意事项 图片和扫描文件通常以非文本格式存在&#xff0c;这使得其中的文字信息难以直接编辑、搜索或复制。为了解决这个问题&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术应运而生。OCR通过分析…

【C++】C++11新特性详解:可变参数模板与emplace系列的应用

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…

使用宝塔面板快速部署SpringBoot+Vue项目(Java + Node)

使用宝塔面板快速部署SpringBootVue项目&#xff08;Java Node&#xff09; 项目主要技术栈准备工作1. 一台云服务器&#xff08;阿里云、腾讯云等&#xff09;&#xff0c;我这里使用的是阿里云的服务器&#xff08;2核2G&#xff09;2. 已安装宝塔面板3. 已开发完成的Spring…

一文弄懂 | YOLOv8网络结构解读 、yolov8.yaml配置文件详细解读与说明、模型训练参数详细解析 | 通俗易懂!入门必看系列!

看这一篇就够了。本文内含YOLOv8网络结构图 yaml配置文件详细解读与说明 训练教程 训练参数设置参数解析说明等一些有关YOLOv8的内容&#xff01; YOLOv8v10专栏订阅链接&#xff1a;YOLOv10 创新改进高效涨点持续改进300多篇永久免费答疑 &#xff08;订阅的小伙伴&#xf…

[C++][第三方库][ODB]详细讲解

目录 1.介绍2.安装1.安装 build22.安装 odb-compiler3.安装 ODB 运行时库4.安装MySQL和客户端开发包5.安装 boost profile 库6.总体操作7.测试样例 3.ODB 常见操作1.ODB 类型映射2.ODB 编程1.指令2.示例 4.类与接口5.使用 1.介绍 ODB框架&#xff1a;数据库ORM框架 --> 对象…

【Python】解决Python报错:ERROR: Could not find a version that satisfies the requirement

成功解决Python报错&#xff1a;ERROR: Could not find a version that satisfies the requirement。ERROR: Could not find a version that satisfies the requirement 是 Python 的包管理工具 pip 在安装包时可能遇到的错误。这通常意味着 pip 没有找到与给定版本要求匹配的包…

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷五)

目录 1. sizeof 和 strlen的区别 1.1 sizeof 1.2 strlen 2. 数组和指针习题解析 2.1 一维数组 2.2 字符数组 代码1&#xff1a; 代码2&#xff1a; 代码3: 代码4&#xff1a; 代码5&#xff1a; 代码6&#xff1a; 2.3 二维数组 3. 指针运算笔试题解析 3.1 3.…

【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)

文章目录 PyQt5入门级超详细教程前言第4部分&#xff1a;事件处理与信号槽机制4.1 什么是信号与槽&#xff1f;4.2 信号与槽的基本用法4.3 信号与槽的基础示例代码详解&#xff1a; 4.4 处理不同的信号代码详解&#xff1a; 4.5 自定义信号与槽代码详解&#xff1a; 4.6 信号槽…

MathType的安装与word嵌入

博主近期在写论文&#xff0c;发现word编辑公式好像只能用MathType&#xff0c;于是就去下载安装&#xff0c;然后遇到了蛮多问题总结一下&#xff0c;希望能帮到有相同问题的大家~ 一.MathType的下载 博主是在官网直接下载的&#xff0c;个人觉得没啥问题&#xff0c;下的也…

matlab:二维绘图篇——plot绘图命令

目录 1.plot绘图命令 &#xff08;1)plot(x) 实例——实验数据曲线 实例——窗口分割 实例——随机矩阵 (2).plot(x,y) 实例——摩擦系数变化曲线 &#xff08;3&#xff09;plot(x1,y1,x2,y2,...) 实例——正弦图形 实例——正弦余弦图形 &#xff08;4&#xff09…