C++从零开始的打怪升级之路(day11)

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

为了巩固前面的知识,最近更新刷题贴,C++进度暂缓

1.反转字符串中的单词

反转字符串中的单词 III

 由于还没学C++的字符串有些题的ac代码是用C语言写的

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序

思路:实现一个子函数,来反转字符串,利用快慢指针在原字符串中“分隔单词”,利用子函数完成任务

void _reverseWords(char* left,char* right)
{while(left < right){char tmp = *left;*left = *right;*right = tmp;++left;--right;}
}char* reverseWords(char* s) 
{char* fast = s;char* slow = s;while(*fast){if(*fast == ' '){_reverseWords(slow,fast - 1);++fast;slow = fast;}else{++fast;}}_reverseWords(slow,fast - 1);return s;
}

这是ac代码,要注意的是,出了while循环后还有最后一次翻转未完成

2.连续字符

1446. 连续字符

给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。

请你返回字符串 s 的 能量

用前后双指针遍历字符串,用conut记录同一字符连续次数,用max存储最大值

int maxPower(char* s) 
{int max = 0;int count = 0;char* slow = s;char* fast = s;while(*fast){if(*fast == *slow){++count;++fast;}else{if(count > max){max = count;}count = 0;slow = fast;}}if(count > max){max = count;}return max;
}

这是ac代码,同样要注意,出whlie循环后还有一次没有比较

3.字符串压缩

面试题 01.06. 字符串压缩

 字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)

和上面的题类似,利用快慢指针获取拷贝题目所需的数据,需要注意的是数字转换成字符串,还有最后的返回标准 

char* compressString(char* S) {char* slow = S;char* fast = S;char* ret = (char*)malloc(sizeof(char) * 100000);int reti = 0;int count = 0;while (*fast) {if (*fast == *slow) {++count;++fast;} else{ret[reti++] = *slow;if (count < 10) {ret[reti++] = count + '0';} else if (count >= 10 && count < 100) {ret[reti++] = count / 10 + '0';ret[reti++] = count % 10 + '0';} else if (count >= 100 && count < 1000) {ret[reti++] = count / 100 + '0';ret[reti++] = count / 10 % 10 + '0';ret[reti++] = count % 10 + '0';} else if (count >= 1000 && count < 10000) {ret[reti++] = count / 1000 + '0';ret[reti++] = count / 100 % 10 + '0';ret[reti++] = count / 10 % 10 + '0';ret[reti++] = count % 10 + '0';}    else if (count >= 10000 && count < 100000) {ret[reti++] = count / 10000 + '0';ret[reti++] = count / 1000 % 10 + '0';ret[reti++] = count / 100 % 10 + '0';ret[reti++] = count / 10 % 10 + '0';ret[reti++] = count % 10 + '0';}count = 0;slow = fast;}}ret[reti++] = *slow;if (count < 10) {ret[reti++] = count + '0';} else if (count >= 10 && count < 100) {ret[reti++] = count / 10 + '0';ret[reti++] = count % 10 + '0';} else if (count >= 100 && count < 1000) {ret[reti++] = count / 100 + '0';ret[reti++] = count / 10 % 10 + '0';ret[reti++] = count % 10 + '0';}     else if (count >= 1000 && count < 10000) {ret[reti++] = count / 1000 + '0';ret[reti++] = count / 100 % 10 + '0';ret[reti++] = count / 10 % 10 + '0';ret[reti++] = count % 10 + '0';} else if (count >= 10000 && count < 100000) {ret[reti++] = count / 10000 + '0';ret[reti++] = count / 1000 % 10 + '0';ret[reti++] = count / 100 % 10 + '0';ret[reti++] = count / 10 % 10 + '0';ret[reti++] = count % 10 + '0';}ret[reti] = '\0';int num1 = strlen(S);int num2 = strlen(ret);if (num2 >= num1) {return S;} else {return ret;}
}

这是ac代码,数字转换成字符串的方式很粗糙,大家有更好的办法可以评论

4.数组中出现次数超一半的数字

数组中出现次数超过一半的数字_牛客题霸_牛客网

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 

1.计数法

创建一个数组初始化全0,遍历给定数组,给创建数组++,遍历创建数组,根据条件改变返回值

int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) 
{int ret = 0;int a[10000] = {0};int i=0;for(i=0;i<numbersLen;i++){++a[numbers[i]];}for(i=0;i<10000;i++){if(a[i] > numbersLen/2){ret = i;}}return ret;
}

 这是ac代码

2.特殊法

利用题目特性,我们可以设计一个计数count,记录x数据出现的次数。遍历数组,拿到numbers[i]后,进行如下操作:

1. 如果count等于0,表明该元素第一次出现,使用x记录该元素,并将count设置为1

2. 否则:如果numbers[i] == x,count++;否则count-- 上述操作结束后,x中标记的元素可能是出现次数刚好超过一般的元素

int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) 
{int count = 0;int x = numbers[0];int i=0;for(i=0;i<numbersLen;i++){if(count == 0){x = numbers[i];count++;}else{if(x == numbers[i]){count++;}else {count--;}}}return x;
}

这是ac代码 

5.两数之和

LCR 006. 两数之和 II - 输入有序数组

给定一个已按照 升序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。

假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。

这题首先肯定不能用暴力枚举,因为时间有限制

下面介绍两种方法

1.左右指针法

初始两个指针,一个指向数组的第一个元素,另一个指向数组最后一个元素,将下标对应的值之和与目标数进行比较,如果大了,就让右指针向左偏移一次,如果小了,就让左指针向右偏移一次,直到得到目标结果

int* twoSum(int* numbers, int numbersSize, int target, int* returnSize)
{int* str = (int*)malloc(sizeof(int)*2);*returnSize = 2;int i = 0;int j = numbersSize - 1;while(1){if(numbers[i] + numbers[j] == target){str[0] = i;str[1] = j;break;}else if(numbers[i] + numbers[j] < target)i++;elsej--;}return str;
}

这是ac代码,具体怎么证明这样不会错过答案,可以自行看官方题解

2.二分法

假定一个数已经找到,将数组元素都减去目标值,另一个数必然存在改变后的数组当中,且数组有序,利用二分法即可求解

int* twoSum(int* numbers, int numbersSize, int target, int* returnSize)
{int* ret = (int*)malloc(sizeof(int)*2);*returnSize = 2;int i=0;for(i=0;i<numbersSize - 1;i++){int left = i + 1;int right = numbersSize - 1;while(left <= right){int mid = (left + right) / 2;if(numbers[mid] + numbers[i] == target){ret[0] = i;ret[1] = mid;return ret;}else if(numbers[mid] + numbers[i] > target){right = mid - 1;}else{left = mid + 1;}}}return ret;
}

这是ac代码

6.几道难题

394. 字符串解码

43. 字符串相乘

这两道题有些难懂,待我功力深一点了再回头解决,明天开始继续C++学习 

今天的博客就到这里了,后续内容明天分享,最近因为考试周原因不能更新太多内容,等考试周结束了再"快马加鞭"

新手第一次写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!! 

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

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

相关文章

大数据深度学习ResNet深度残差网络详解:网络结构解读与PyTorch实现教程

文章目录 大数据深度学习ResNet深度残差网络详解&#xff1a;网络结构解读与PyTorch实现教程一、深度残差网络&#xff08;Deep Residual Networks&#xff09;简介深度学习与网络深度的挑战残差学习的提出为什么ResNet有效&#xff1f; 二、深度学习与梯度消失问题梯度消失问题…

2024年腾讯云轻量服务器和CVM云服务器性能如何?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

RaspberryPi(树莓派)配置 VNC

RaspberryPi&#xff08;树莓派&#xff09;是可以通过 VNC 来连接到机器上进行图形化操作的。 什么 VNC VNC&#xff08;Virtual Network Computing&#xff09;&#xff0c;为一种使用RFB协议的屏幕画面分享及远程操作软件。此软件借由网络&#xff0c;可发送键盘与鼠标的动…

boost库读写json格式文件

简介 本文通过boost库&#xff0c;版本为1.84。对json格式文件创建和解析的一个简单的Demo。生成过程中可能会用到库&#xff0c;需要指定库路径。本文通过单个key字段进行值的获取。也有其它方式比如key1.key2.key3.xxx获取值&#xff0c;每一个key代表一个节点。 #include &…

node.js(express.js)+mysql实现注册功能

文章目录 实现步骤一、获取客户端提交到服务器的用户信息&#xff0c;对表单中的数据&#xff0c;进行合法性的效验 代码如下:二、检测用户名是否被占用三、对密码进行加密四、插入新用户&#xff08;完整代码&#xff09;总结 实现步骤 一、获取客户端提交到服务器的用户信息…

plc红绿灯程序

引言&#xff1a; PLC&#xff08;Programmable Logic Controller&#xff0c;可编程逻辑控制器&#xff09;是一种用于工业自动化控制的电子设备。西门子的SIMATIC S7-200是这类设备的一个流行系列&#xff0c;广泛应用于小型至中等规模的自动化项目中。它具有以下特点&#…

常见的设计模式(模板与方法,观察者模式,策略模式)

前言 随着时间的推移&#xff0c;软件代码越来越庞大&#xff0c;随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前&#xff0c;使用的是面向过程开发来设计大型的软件程序&#xff0c;面向过程开发将软件分成一个个单独的模块&#xff0c;模块之间使用函数…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

7.6 MySQL基本函数的使用(❤❤❤)

7.6 MySQL基本函数的使用 1. 提要2. 数字函数3. 字符函数3.1 替换字符3.2 左填充字符及截取字符串 4. 日期函数4.1 日期函数4.2 表达式占位符4.3 日期偏移计算4.4 日期间隔 5. 条件函数5.1 IF语句5.2 case...when语句 1. 提要 2. 数字函数 3. 字符函数 3.1 替换字符 -- INSERT…

[剪藏] - 任泽平年终演讲精华:点燃希望——2024中国经济十大预测

任泽平年终演讲精华&#xff1a;点燃希望——2024中国经济十大预测 泽平宏观 2023-12-23 08:01 发表于上海 12月22日22:30&#xff0c;任泽平年终秀“点燃希望乐观者前行——2024中国经济十大预测”圆满收官。 泽平宏观、北京广播电视台、上海高净值研究院、北京时间等携手打…

Gorm 应用开发时区问题与unique唯一索引字段数据冲突问题

文章目录 一、定义表模型时区问题1.1 time.Time 与int641.2 优势 二、unique唯一索引字段数据冲突问题 一、定义表模型时区问题 1.1 time.Time 与int64 一般情况下&#xff0c;我们在定义表模型的时候&#xff0c;会使用time.Time&#xff0c;但是会根据当前时间存储。返回给…

现代密码学 考点汇总(下)

现代密码学 考点汇总 写在最前面考试范围一、给一个简单的方案&#xff0c;判断是否cca安全二、随机预言机模型之下的简单应用 2. MAC概念回顾MAC的定义适应性CMA&#xff08;Chosen Message Attack&#xff09;PPT攻击者不可忽略的概率&#xff08;negl(n)&#xff09;总结 案…

three.js 点按钮,相机飞行靠近观察设备

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right&quo…

vue2+webpack升级vue3+vite,报错Cannot read properties of null (reading ‘isCE‘)

同学们可以私信我加入学习群&#xff01; 正文开始 前言问题分析解决总结 前言 系列文章&#xff1a;vue2webpack升级vue3vite&#xff0c;修改插件兼容性bug 前面的文章主要是介绍&#xff0c;在升级初始阶段遇到的一些显而易见的兼容性问题和bug。随着项目迭代的不断深入&a…

视频美颜SDK技术解析与技术对比

当下&#xff0c;各类应用和服务纷纷采用视频美颜SDK&#xff0c;以提供更加令人满意的视觉效果。本文将深入探讨视频美颜SDK的技术原理&#xff0c;同时对比不同SDK的特性&#xff0c;为开发者和决策者提供全面的技术参考。 一、技术原理解析 1.图像处理基础 视频美颜SDK基…

易懂的方式讲解ARM中断原理以及中断嵌套方法

ARM有七种模式&#xff0c;我们这里只讨论SVC、IRQ和FIQ模式。 我们可以假设ARM核心有两根中断引脚&#xff08;实际上是看不见的&#xff09;&#xff0c;一根叫 irq pin, 一根叫fiq pin。在ARM的cpsr中&#xff0c;有一个I位和一个F位&#xff0c;分别用来禁止IRQ和FIQ。 先…

消息队列之RabbitMQ介绍

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 消息队列之RabbitMQ介绍 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、RabbitMQ介绍…

MyBatisPlus学习笔记三-核心功能

接上篇&#xff1a; MyBatisPlus学习笔记二-CSDN博客 1、核心功能-IService开发基础业务接口 1.1、介绍 1.2、引用依赖 1.3、配置文件 1.4、用例-新增 1.5、用例-删除 1.6、用例-根据id查询 1.7、用例-根据ids查询 2、核心功能-IService开发复杂业务接口 2.1、实例-更新 3、…

Elasticsearch各种文档操作2

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据过滤字段查询文档概述指定想要显示的字段示例 初始化文档数据 在进行各种文档操作之前&#xff0c;我们先进行初始化文档数据的工作 过滤字段查询文档 概述 默认情况下&#xff0c;Elasticsearch 在搜索的结果中…

vite和webpack的区别和作用

前言 Vite 和 Webpack 都是现代化的前端构建工具&#xff0c;它们可以帮助开发者优化前端项目的构建和性能。虽然它们的目标是相似的&#xff0c;但它们在设计和实现方面有许多不同之处。 一、Vite详解和作用 vite 是什么 vite —— 一个由 vue 作者尤雨溪开发的 web 开发工…