【LeetCode】【C++】string OJ必刷题

👀樊梓慕:个人主页

 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》

🌝每一个不曾起舞的日子,都是对生命的辜负


目录

前言

【LeetCode】415.字符串相加

【LeetCode】43.字符串相乘 

 【LeetCode】125.验证回文字符串

【LeetCode】541.反转字符串Ⅱ

【LeetCode】557.反转字符串中的单词Ⅲ


前言

利用string的一些常用方法解题,本篇文章不乏有你眼前一亮的优秀方法,欢迎大家订阅。

欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码:🌟fanfei_c的仓库🌟

=========================================================================


【LeetCode】415.字符串相加

=================================原题链接=================================

415. 字符串相加icon-default.png?t=N7T8https://leetcode.cn/problems/add-strings/

 =========================================================================

题目:

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。


实际应用中,可能会有一些非常大的数字要求进行计算,甚至long long类型都无法容纳。

那么此时我们就需要利用字符串,简称“大数运算”。

思路:

实际上就是简单的加法的思路,主要难点在于如何控制进位。

代码实现(未优化):

class Solution {
public:string addStrings(string num1, string num2) {int end1=num1.size()-1,end2=num2.size()-1;string retStr;int next=0;while(end1>=0 || end2>=0){      int val1=0,val2=0;   if(end1>=0)val1=num1[end1--]-'0';//拿到末尾数字if(end2>=0)val2=num2[end2--]-'0';//拿到末尾数字int ret=val1+val2+next;next=ret/10;//得到进位ret%=10;//得到该位计算结果retStr.insert(retStr.begin(),'0'+ret);}if(next==1)//如果进位有剩余,不要忘记进位补充到数字中{retStr.insert(retStr.begin(),'1');}return retStr;}
};


 为什么时间复杂度会这么高呢?

实际上是因为insert方法,整个算法最后的时间复杂度为O(N^2),insert为头插,每次头插都需要挪动后面的元素,这也是导致了时间复杂度偏高的原因,那么如何解决呢?

优化思路:

  • 我们知道尾插在这里的效率肯定是强于头插的,唯一需要解决的问题就是尾插得到的字符串是“反”的,那我们只需要调用reverse方法翻转字符串即可。

代码实现(优化):

class Solution {
public:string addStrings(string num1, string num2) {int end1 = num1.size() - 1, end2 = num2.size() - 1;string retStr;int next = 0;while (end1 >= 0 || end2 >= 0){int val1 = 0, val2 = 0;if (end1 >= 0)val1 = num1[end1--] - '0';if (end2 >= 0)val2 = num2[end2--] - '0';int ret = val1 + val2 + next;next = ret / 10;ret %= 10;retStr += (ret + '0');}if (next == 1)//如果有剩余进位则尾插剩下的进位数字{retStr += '1';}reverse(retStr.begin(), retStr.end());return retStr;}
};


【LeetCode】43.字符串相乘 

=================================原题链接=================================

43.字符串相乘 icon-default.png?t=N7T8https://leetcode.cn/problems/multiply-strings/description/

 =========================================================================

题目:

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。


 思路:

乘法的进位与加法有相似之处,但不好控制的是被乘数乘以乘数的每一位所得到的结果需要错位相加。

比如:

代码实现:

class Solution {
public://乘方法string multiply(string num1, string num2) {int end1 = num1.size() - 1, end2 = num2.size() - 1;string reg;int next = 0;string retStr;//判断是否有字符串为0,如有直接输出0if(num1=="0"){return num1;   }if(num2=="0"){return num2;}while (end2 >= 0)//双层循环,因为根据乘法,我们知道被乘数每个数字都要被乘数乘{while (end1 >= 0)//内层循环得到的reg是被乘数乘个/十/百/···的结果{int val1 = 0, val2 = 0;if (end1 >= 0)val1 = num1[end1--] - '0';val2 = num2[end2] - '0';int ret = val1 * val2 + next;next = ret / 10;ret %= 10;reg += (ret + '0');}if (next != 0)//将未加的进位补上{reg += (next + '0');}reverse(reg.begin(), reg.end());//由于之前在尾插,数字为反着的,所以这里反转回来//之前采用尾插是因为尾插的复杂度低于头插//这步是为了错位相加用,比如当被乘数乘乘数的十位得到的数字,应该比被乘数乘乘数的个位多一位0,才能保证乘法逻辑的正确for (int i = 0; i < count - end2; i++){reg += '0';}retStr = addStrings(retStr, reg);//调用加方法,利用实现好的加方法将乘完的结果加在一起//调整参数end2--;end1 = num1.size() - 1;next=0;reg.clear();}return retStr;}
};

 【LeetCode】125.验证回文字符串

=================================原题链接=================================

125.验证回文字符串icon-default.png?t=N7T8https://leetcode.cn/problems/valid-palindrome/description/

 =========================================================================

题目:

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 


判断回文是我们的老朋友了,利用左右指针即可轻松解决,需要注意的无非就是字符的转化。

代码实现:

class Solution {
public:bool isDigtalOrWord(char ch){if ((ch >= '0' && ch <= '9')|| (ch >= 'A' && ch <= 'Z')|| (ch >= 'a' && ch <= 'z'))return true;return false;}bool isPalindrome(string s){if (s.empty())return true;for (int i = 0; i < s.size(); ++i){s[i] = tolower(s[i]); //忽略大小写      }int left = 0;int right = s.size() - 1;while (left < right){//找到左边第一个未比较的字母while (left < right && !isDigtalOrWord(s[left]))left++;//找到右边第一个未比较的字母while (left < right && !isDigtalOrWord(s[right]))right--;//左右两边字母若不相等,则不是回文if (s[left] != s[right])return false;left++;right--;}return true;}
};

【LeetCode】541.反转字符串Ⅱ

=================================原题链接=================================

541. 反转字符串 IIicon-default.png?t=N7T8https://leetcode.cn/problems/reverse-string-ii/description/

 =========================================================================

题目:

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。


代码实现:

class Solution {
public://翻转start到end区间的字符串void Reverse(string& s, int start, int end){char tmp;end--;while (start < end){tmp = s[start];s[start] = s[end];s[end] = tmp;start++;end--;}}string reverseStr(string s, int k){int len = s.size();for (int i = 0; i < len; i += 2 * k){if (i + k < len)Reverse(s, i, i + k);elseReverse(s, i, len);}return s;}
};

【LeetCode】557.反转字符串中的单词Ⅲ

=================================原题链接=================================

557. 反转字符串中的单词 IIIicon-default.png?t=N7T8https://leetcode.cn/problems/reverse-words-in-a-string-iii/description/

 =========================================================================

题目:

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


思路:

  • 1. 通过查找空格,分割单词
  • 2. 针对分割的单词进行翻转

代码实现:

class Solution {
public:void Reverse(string& s, int start, int end){char tmp;while (start < end){tmp = s[start];s[start] = s[end];s[end] = tmp;start++;end--;}}string reverseWords(string s){size_t start = 0;size_t end = 0;while (start < s.size()){end = s.find(' ', start);if (end == string::npos){end = s.size();break;}Reverse(s, start, end - 1);start = end + 1;}Reverse(s, start, end - 1);return s;}
};

=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

🌟~ 点赞收藏+关注 ~🌟

========================================================================= 

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

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

相关文章

一个数据中心的PUE修养,必将迎来液冷存储的曙光

实现小于1.3的PUE硬指标&#xff0c;数据中心液冷存储将功不可没。 【全球存储观察 &#xff5c; 科技热点关注】 4000亿千瓦时&#xff0c;能耗如此惊人&#xff0c;这是预计到2030年全国数据中心的年耗电总量。 小于1.3&#xff0c;看似微不足道的数字&#xff0c;这是新建…

【神印王座】永恒之塔秘密透露,林鑫告白李馨,皓晨采儿甜蜜接吻

Hello,小伙伴们&#xff0c;我是拾荒君。 《神印王座》第83集如期而至&#xff0c;带来了令人期待已久的更新。与众多热情的观众一样&#xff0c;拾荒君一得到更新消息&#xff0c;便急不可耐地观赏起来。这一集中&#xff0c;龙皓晨随着月魔宫的月夜商队成功抵达联盟&#xf…

vue3使用动态component

使用场景&#xff1a; 多个组件通过component标签挂载在同一个组件中&#xff0c;通过触发时间进行动态切换。vue3与vue2用法不一样&#xff0c;这里有坑&#xff01; 使用方法&#xff1a; 1.通过vue的defineAsyncComponent实现挂载组件 2.component中的is属性 父组件&am…

git-5

1.GitHub为什么会火&#xff1f; 2.GitHub都有哪些核心功能&#xff1f; 3.怎么快速淘到感兴趣的开源项目 github上面开源项目非常多&#xff0c;为了我们高效率的找到我们想要的资源 根据时间 不进行登录&#xff0c;是没有办法享受到高级搜索中的代码功能的&#xff0c;登录…

超详解线段树(浅显易懂,几乎涵盖所有线段树类型讲解,匠心之作,图文并茂)

一&#xff0c;什么是线段树&#xff1f; 线段树是怎样的树形结构? 线段树是一种二叉搜索树&#xff0c;而二叉搜索树&#xff0c;首先满足二叉树&#xff0c;即每个结点最多有两颗子树&#xff0c;并且是一颗搜索树&#xff0c;我们要知道&#xff0c;线段树的每个结点都存储…

记录 | onnx-simplifier安装、使用

安装&#xff1a; pip install onnx-simplifier# 若想加速 # [可选] 使用豆瓣源加速 pip install -i https://pypi.douban.com/simple onnx-simplifier# [可选] 使用阿里源加速 pip install -i http://mirrors.aliyun.com/pypi/simple onnx-simplifier使用&#xff1a; pytho…

phpoffice在tp框架中如何实现导入导出功能

安装 phpoffice/phpspreadsheet 库 composer require phpoffice/phpspreadsheet 导入功能 创建一个用于上传文件的视图&#xff0c;可以使用元素来实现文件上传。 <!-- application/view/your/import.html --><form action"{:url(your/import)}" method&q…

Linux MTR(My TraceRoute)command

Internet上有许多小型网络测试工具:Ping、Traceroute、Dig、Host等。 但是&#xff0c;这些工具的功能都比较单一。今天会给大家分享一个包含ping和traceroute功能的工具&#xff1a;MTR 文章目录 什么是MTR&#xff1f;MTR可以提供哪些功能Linux MTR可用选项Linux MTR用法推荐…

开源运维监控系统-Nightingale(夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…

三季度利空出尽,金山软件即将“破茧”?

引言&#xff1a;近日&#xff0c;金山软件&#xff08;以下简称为“金山”&#xff09;披露了2023Q3 季报&#xff0c;AI业绩首次兑现如约而至&#xff0c;而伴随着全球AI商业化进程加速&#xff0c;作为国产办公软件领军企业的金山软件是否也迎来了新的盈利风口期&#xff1f…

(python)cf火线瞄准红名自动开枪

一. 前言 这个应该cf系列第四篇了&#xff0c;目前已经写了ai瞄准&#xff0c;罗技鼠标宏&#xff0c;这篇功能相比前俩个更简单一些,因为代码不多所以就不写类与功能函数了&#xff0c;直接直捣黄龙&#xff0c;我还写了一些辅助脚本&#xff0c;可以用来获取鼠标当前坐标和颜…

视频剪辑合并:批量处理视频,高效快捷,添加背景音乐更添魅力

随着数字媒体的普及&#xff0c;视频已成为生活中不可或缺的一部分。无论是记录生活、分享经验&#xff0c;还是传递信息&#xff0c;视频都以其独特的魅力占据了重要的地位。而在这个快节奏的时代&#xff0c;如何高效地处理视频&#xff0c;以及如何通过添加背景音乐来提升视…