C++:OJ练习(每日练习系列)

编程题:

题一:字符串相加

415. 字符串相加 - 力扣(LeetCode)

思路一:

第一步:需要获取字符串的两个尾节点下标

第二步:创建用于记录进位数、获得的字符串的变量

第三步:只要有进位或还有数没有加完继续循环利用三目运算:有符号+符号,无符号+0

第四步:最后将得到的字符串逆置,就是需要的结果。

class Solution {
public:string addStrings(string num1, string num2) {//获取字符串的尾节点int it1 = num1.size() - 1;int it2 = num2.size() - 1;//记录进位数int count = 0;//获得的字符串string s1 = "";//有进位或还有数没有加完while(it1 >= 0 || it2 >= 0 || count != 0){//三目运算:有符号+符号,无符号+0int x = it1 >= 0 ? num1[it1] - '0' : 0;int y = it2 >= 0 ? num2[it2] - '0' : 0;int n = x + y + count;int num = n % 10;count = n / 10;s1.push_back(num + '0');--it1;--it2;}//得到的是逆置的字符串reverse(s1.begin(),s1.end());return s1;}
};

题二:验证回文串

125. 验证回文串 - 力扣(LeetCode)

思路一:

第一步:遍历字符串将大写改小写并删除非字母和数字的字符

第二步:判断对称比较字符是否相等

class Solution {
public:bool isPalindrome(string s) {//遍历字符串将大写改小写并删除非字母和数字的字符for(int i = 0; i < s.size();i++){s[i] = tolower(s[i]);if((s[i] < 'a' || s[i] > 'z') && (s[i] < '0' || s[i] > '9')){s.erase(i,1);i--;}}//对称比较字符是否相等int left = 0;int right = s.size() - 1;while(left < right){if(s[left] != s[right]){return false;}left++;right--;}return true;}
};

题三:反转字符串

541. 反转字符串 II - 力扣(LeetCode)

思路一:

第一步:分别创建记录起始位置和末尾位置的节点

第二步:只要后面还有字符就继续执行循环1.计数2k个字符,就反转这2k字符中的前k个字符;2.字符小于2k但大于或等于k个,则反转前k个字符;3.剩余字符少于k个,将剩余字符全部反转。

特别注意:reverse是逆置左闭右开的区间!!!

class Solution {
public:string reverseStr(string s, int k) {//分别创建记录起始位置和末尾位置的节点string::iterator cur = s.begin();string::iterator tail = s.end();//只要后面还有字符就继续执行while(cur != tail){//计数2k 个字符,就反转这2k字符中的前k个字符if(cur + 2*k <= tail){//需要注意reverse是左闭右开的区间reverse(cur,cur + k );cur += 2*k;}//字符小于2k但大于或等于k个,则反转前k个字符else if(cur + k <= tail){reverse(cur,cur + k );break;}//剩余字符少于k个,将剩余字符全部反转else{reverse(cur,tail);break;}}return s;}
};

思路二:

        反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。

class Solution {
public:string reverseStr(string s, int k) {int n = s.length();for (int i = 0; i < n; i += 2 * k) {reverse(s.begin() + i, s.begin() + min(i + k, n));}return s;}
};

题四:反转字符串的单词

557. 反转字符串中的单词 III - 力扣(LeetCode)

思路一:

第一步:定义变量left、right从第一个字符开始,以及tail来记录字符串长度

第二步:如果没有超过字符串长度就继续循环1.定位一个单词的区间、2。逆置(我们这里用的是下标访问,无法使用reverse来进行逆置)、3.再排除空格的影响;

void my_reverse(string& s1,int left,int right)
{while(left < right){swap(s1[left],s1[right]);++left;--right;}
}
class Solution {
public:string reverseWords(string s) {int left = 0;int right = 0;int tail = s.size();//没有超过字符串长度就循环while(right < tail){//定位一个单词的区间while(s[right] != ' ' && s[right] != '\0'){++right;}//逆置my_reverse(s,left,right-1);//排除空格的影响while(s[right] == ' ')++right;left = right;}return s;}
};

题五:字符串相乘

43. 字符串相乘 - 力扣(LeetCode)

思路一:

第一步创建:1.得到最后的结果的s1、2.count用于记录进位、enter用于记录进行了几次乘加;

第二步:while循环中1.n1做为被乘数,n2做为乘数,tmp用于记录当前的乘积2.再内置一个while循环实现乘法,3.将所得结果逆置,4.对每一次的乘积进行当前结果求和(这里直接在题意字符串相加的基础上缩小了相加的范围实现了乘加);

第三步:最后:判断:如果字符串全为‘0’,则返回“0”,否则正常输出计算所得的字符串。

class Solution {
public:
string addStrings(string num1, string num2,int enter) {//获取字符串的尾节点int it1 = num1.size() - 1 -enter;int it2 = num2.size() - 1;//记录进位数int count = 0;//获得的字符串string s1 = "";//有进位或还有数没有加完while(enter--){s1.push_back(num1[it1+enter+1]);}while(it1 >= 0 || it2 >= 0 || count != 0){//三目运算:有符号+符号,无符号+0int x = it1 >= 0 ? num1[it1] - '0' : 0;int y = it2 >= 0 ? num2[it2] - '0' : 0;int n = x + y + count;int num = n % 10;count = n / 10;s1.push_back(num + '0');--it1;--it2;}//得到的是逆置的字符串reverse(s1.begin(),s1.end());return s1;}string multiply(string num1, string num2) {//得到最后的结果的s1string s1;//count用于记录进位int count = 0;//enter用于记录进行了几次乘加int enter = 0;//n1做为被乘数int n1 = num1.size() - 1;while(0 <= n1){//n2做为乘数int n2 = num2.size() - 1;//tmp用于记录当前的乘积string tmp;//实现乘法while(0 <= n2 || count != 0){int x = n1 >= 0 ? num1[n1] - '0' : 0;int y = n2 >= 0 ? num2[n2] - '0' : 0;int num = x * y + count;count = num / 10;tmp.push_back((num % 10) + '0');--n2;}//所得结果逆置reverse(tmp.begin(),tmp.end());//对每一次的乘积进行当前结果求和s1 = addStrings(s1,tmp,enter);++enter;--n1;}//判断:如果字符串全为‘0’,则返回“0”int nn = s1.size() ;while(nn--){if(s1[nn] - '0' != 0){return s1;}}return "0";}};

本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!

                                              

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

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

相关文章

随手写了个博客多平台发布脚本:Python自动发布文章到Wordpress

​ 引言 作为一名技术博主&#xff0c;提高博客发布效率是我们始终追求的目标。在这篇文章中&#xff0c;我将分享一个基于Python的脚本&#xff0c;能够实现博客多平台发布&#xff0c;具体来说&#xff0c;是自动发布文章到WordPress。通过这个简单而高效的脚本&#xff0c…

2023 年 IntelliJ IDEA下载、安装教程,附详细图文

大家好&#xff0c;今天为大家带来的是 2023年 IntelliJ IDEA 下载、安装教程&#xff0c;超详细的图文教程&#xff0c;亲测可用。 文章目录 1 IDEA 下载2 IDEA 安装3 IDEA 使用4 快捷键新手必须掌握&#xff1a;Ctrl&#xff1a;Alt&#xff1a;Shift&#xff1a;Ctrl Alt&a…

解决电脑蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED,回到系统还原点

解决电脑蓝屏问题&#xff1a;SYSTEM_THREAD_EXCEPTION_NOT_HANDLED&#xff0c;回到系统还原点 1&#xff0c;蓝屏显示问题1.1&#xff0c;蓝屏1&#xff0c;清楚显示1.2&#xff0c;蓝屏2&#xff0c;模糊显示 2&#xff0c;排除故障问题3&#xff0c;解决蓝屏的有效方法 1&a…

【攻防世界-misc】[简单] 凯撒大帝在培根里藏了什么

1.下载文件&#xff0c;打开后是这样子的 2.根据题目提示说是有凯撒密码和培根密码&#xff0c;因为文件内容为AB形式&#xff0c;不符合凯撒条件&#xff0c;所以先用培根解&#xff0c;将文件内容复制&#xff0c;CTF在线工具-CTF工具|CTF编码|CTF密码学|CTF加解密|程序员工具…

软件工程--需求工程--学习笔记(超详细)

软件需求工程是软件开发周期的第一个阶段&#xff0c;也是关系到软件开发成败最关键阶段&#xff0c;本章讲解需求的基础知识和需求工程的关键活动。这些知识对于结构化方法、面向对象方法、面向服务方法等都是适用的 本文参考教材&#xff1a;沈备军老师的《软件工程原理》 目…

Redis String类型

String 类型是 Redis 最基本的数据类型&#xff0c;String 类型在 Redis 内部使用动态长度数组实现&#xff0c;Redis 在存储数据时会根据数据的大小动态地调整数组的长度。Redis 中字符串类型的值最大可以达到 512 MB。 关于字符串需要特别注意∶ 首先&#xff0c;Redis 中所…

ROS2+STM32小车红外对射光电计数器模块资料

数据&#xff1a;一个周长内有20个孔洞或者20个分隔。外径&#xff1a;6.8cm 图片不是实物图&#xff0c;是示意图 因为没有串口&#xff0c;所以不可能会发送出数字的&#xff0c;就是通过电压变化次数来计算距离或者其他数据 有遮挡时&#xff0c;输出高电平&#xff0c;无遮…

主流数据库类型总结

前言&#xff1a;随着互联网的高速发展&#xff0c;为了满足不同的应用场景&#xff0c;数据库的种类越来越多容易混淆&#xff0c;所以有必要在此总结一下。数据库根据数据结构可分为关系型数据库和非关系型数据库。非关系型数据库中根据应用场景又可分为键值&#xff08;Key-…

Vue3-路由

VueRouter4路由语法解析 1.创建路由实例由createRouter实现 2.路由模式 1&#xff09;history模式使用createWebHistory()&#xff1a;地址栏不带# 2&#xff09;hash模式使用createWebHashHistory()&#xff1a;地址栏带# 3&#xff09;参数是基础路径&#xff0c;默认/ …

python高级练习题库实验1(A)部分

文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目4代码实验结果题目总结题目1 输入一个整数,用于控制输出*的个数,输入日期,按照特定格式输出 研究下面的例子,并编写一个与这些例子完全相同的程序。 代码 import datetime# ask user for length of b…

Linux常用命令----mkdir命令

文章目录 1. 基础概念2. 参数含义3. 常见用法4. 实例演示5. 结论 在Linux操作系统中&#xff0c;mkdir 命令是用来创建目录的基础命令。这个命令简单但极其强大&#xff0c;是每个Linux用户都应当熟悉的工具之一。以下是对mkdir命令的详细介绍&#xff0c;包括其参数含义、常见…

tex2D使用学习

1. 背景&#xff1a; 项目中使用到了纹理进行插值的加速&#xff0c;因此记录一些自己在学习tex2D的一些过程 2. 代码&#xff1a; #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <assert.h> #include <stdio.h>…