【C++ • STL • 力扣】详解string相关OJ

文章目录

  • 1、仅仅翻转字母
  • 2、字符串中的第一个唯一字符
  • 3、字符串里最后一个单词的长度
  • 4、验证一个字符串是否是回文
  • 5、字符串相加
  • 总结


ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ"
在是图片描是小刘述


1、仅仅翻转字母

力扣链接
代码1展示:【下标】


class Solution {
bool isLetter(const char& c)
{if (c >= 'a' && c <= 'z')return true;else if (c >= 'A' && c <= 'Z')return true;elsereturn false;
}
public:string reverseOnlyLetters(string s){int left = 0;int right = s.size() - 1;while (left < right){while (left < right && !isLetter(s[left])){left++;}while (left < right && !isLetter(s[right])){right--;}swap(s[left], s[right]);++left;--right;}        return s;}
};

代码2展示:【迭代器】

class Solution {
bool isLetter(const char& c)
{if (c >= 'a' && c <= 'z')return true;else if (c >= 'A' && c <= 'Z')return true;elsereturn false;
}
public:string reverseOnlyLetters(string s){string::iterator leftIt = s.begin();string::iterator rightIt = s.end() - 1;while (leftIt < rightIt){while (leftIt < rightIt && !isLetter(*leftIt)){leftIt++;}while (leftIt < rightIt && !isLetter(*rightIt)){rightIt--;}swap(*leftIt, *rightIt);++leftIt;--rightIt;}        return s;}
};

思路:快速排序中的单趟排序

知识点:C++库提供了swap的函数,可以直接调用。

2、字符串中的第一个唯一字符

力扣链接
代码展示

class Solution {
public:int firstUniqChar(string s) {int count[26] = { 0 };for (auto ch : s){count[ch - 'a']++;}for (size_t i = 0; i < s.size(); i++){if (count[s[i] - 'a'] == 1){return i;}}return -1;}
};

思路:计数排序的思想

3、字符串里最后一个单词的长度

牛客链接
代码展示

#include <iostream>
using namespace std;int main()
{string s;getline(cin, s);size_t pos = s.rfind(' ');if (pos != string::npos){cout << s.size() - (pos + 1);}else {cout << s.size();}return 0;
}

思路:首先得到倒数第一个空格的下标,然后size进行减去(下标+1)

知识点:cin遇见空格会认为获取结束,当遇见一行字符串的时候,该字符串中间有空格,那么就不会获取到整行的字符串。getline会获取一行的字符串,遇到空格也不会认为获取终止。

4、验证一个字符串是否是回文

力扣链接
代码展示

class Solution {
public:bool isLetterOrNumber(char ch){return (ch >= '0' && ch <= '9')|| (ch >= 'a' && ch <= 'z')|| (ch >= 'A' && ch <= 'Z');}bool isPalindrome(string s) {//小写换成大写for(auto& ch : s){if (ch >= 'a' && ch <= 'z'){ch -= 32;}}int begin = 0;int end = s. size() - 1;while (begin < end){while(begin < end && !isLetterOrNumber(s[begin])){++begin;}while(begin < end && !isLetterOrNumber(s[end])){--end;}if(s[begin] != s[end]){return false;}else{++begin;--end;}}return true;}
};

5、字符串相加

力扣链接
代码1展示:(头插)

class Solution {
public:string addStrings(string num1, string num2) {int end1 = num1.size() - 1;int end2 = num2.size() - 1;int carry = 0;//进位string s;while (end1 >= 0 || end2 >= 0){//字符转换为数字int val1 = end1 >= 0 ? num1[end1] - '0' : 0;int val2 = end2 >= 0 ? num2[end2] - '0' : 0;int ret = val1 + val2 + carry;if (ret >= 10){ret -= 10;carry = 1;}else{carry = 0;}s.insert(s.begin(), ret + '0');end1--;end2--;}if (carry == 1){s.insert(s.begin(), '1');}return s;}
};

这个代码,使用头插,时间复杂度为O(N^2),算法不是最优的
代码2展示

class Solution {
public:string addStrings(string num1, string num2) {int end1 = num1.size() - 1;int end2 = num2.size() - 1;int carry = 0;//进位string s;while (end1 >= 0 || end2 >= 0){//字符转换为数字int val1 = end1 >= 0 ? num1[end1] - '0' : 0;int val2 = end2 >= 0 ? num2[end2] - '0' : 0;int ret = val1 + val2 + carry;if (ret >= 10){ret -= 10;carry = 1;}else{carry = 0;}//s.insert(s.begin(), ret + '0');s += (ret + '0');end1--;end2--;}if (carry == 1){s += '1';//s.insert(s.begin(), '1');}reverse(s.begin(), s. end());return s;}
};

思路:倒着进行加法运算,当两个字符串的位数不一样的时候,位数少的前面进行补0【两个字符串都结束的时候才可以认为结束。【注意下标问为0的位置的进位】】

知识点:大数运算(当一个数字非常大的时候,可以用字符串的形式进行存放),字符串是不能进行加减运算的。此时就需要我们写代码。


总结

以上就是今天要讲的内容,本文详细的介绍了string的OJ题。希望给友友们带来帮助!

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

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

相关文章

Gitlab仓库部署

Gitlab仓库部署 一、Gitlab的概述1、gitlab介绍2、gitlab主要功能3、gitlab和github的区别 二、部署环境1、安装依赖环境2、安装Postfix邮箱3、Gitlab优势4、Gitlab工作流程 三、Gitlab部署过程1、Yum安装Gitlab2、配置gitlab站点URL3、启动并访问Gitlab 四、Gitlab具体操作1、…

X86_64函数调用汇编程序分(2)

X86_64函数调用汇编程序分&#xff08;2&#xff09; 1 X86_64寄存器使用标准2 leaveq和retq指令2.1 leaveq2.2 retq 3 执行leaveq和retq之后栈的结构3.1 执行leaveq之后栈的结构3.1.1 test_fun_b函数执行leaveq之前的栈结构示意图3.1.2 test_fun_b函数执行leaveq之后的栈结构示…

招投标软件系统技术和服务解决方案

附件为全部文章&#xff0c;敬请下载。 ↑&#xff08;完全免费&#xff0c;直接免费下载&#xff09; 软件系统技术和服务解决方案 目录 第一部分 服务方案 6 第一节、 服务方案概述 6 第二节、 服务方式 6 第三节、 服务机构 7 第四节、 服务响应 8 第五节、 服务内容 9 第六…

HarmonyOS应用开发—资源分类与访问

应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同的设备或配置中的表…

Axure RP 10汉化版下载 Axure RP 10 mac授权码

Axure RP10汉化版是最强大的计划&#xff0c;原型设计和交付给开发人员的方法&#xff0c;而无需编写代码。能够制作逼真的&#xff0c;动态形式的原型。 Axure RP 10汉化版下载 Axure RP 10 mac授权码 RP 10有什么新功能&#xff1f; 1.显示动态面板 使用Axure RP 10&…

列表和字典练习

定义四个学生信息 在Python环境下&#xff0c;用列表定义&#xff1a; >>> stu1[xiaoming,True,21,79.9] >>> stu1[lihong,False,22,69.9] >>> stu1[zhangqiang,True,20,89.9] >>> stu1[EMT,True,23,99.9]如图&#xff0c;定义了四个列表…

React Native 环境配置(mac)

React Native 环境配置&#xff08;mac&#xff09; 1.Homebrew2.Node.js、WatchMan3.Yarn4.Android环境配置1.安装JDK2.下载AndroidStudio1.国内配置 Http Proxy2.安装SDK1.首先配置sdk的路径2.SDK 下载 3.创建模拟器4.配置 ANDROID_HOME 环境变量 5.IOS环境1.升级ruby&#x…

清理 Ubuntu 系统的 4 个简单步骤

清理 Ubuntu 系统的 4 个简单步骤 现在&#xff0c;试试看这 4 个简单的步骤&#xff0c;来清理你的 Ubuntu 系统吧。 这份精简指南将告诉你如何清理 Ubuntu 系统以及如何释放一些磁盘空间。 如果你的 Ubuntu 系统已经运行了至少一年&#xff0c;尽管系统是最新的&#xff0c;…

回归与聚类算法系列⑤:逻辑回归

目录 1、介绍 2、原理 输入 激活函数 3、损失及其优化 损失函数 优化 4、API 5、案例&#xff1a;乳腺癌肿瘤预测 数据集 代码 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0…

.Net MVC 使用Areas后存在相同Controller时报错的解决办法; 从上下文获取请求的Area名及Controller名

先来说个额外的问题&#xff1a;如何在请求上下文&#xff08;比如过滤器的中&#xff09;获取请求对应的Area和Controller 名字&#xff1f;&#xff08;假设请求上下文对象为 filterContext &#xff09;&#xff1a; 1. 获取Area名: (string)filterContext.RouteData.DataTo…

Tomcat多实例部署和动静分离

一、多实例部署&#xff1a; 多实例&#xff1a;多实例就是在一台服务器上同时开启多个不同的服务端口&#xff0c;同时运行多个服务进程&#xff0c;这些服务进程通过不同的socket监听不同的服务端口来提供服务。 1.前期准备&#xff1a; 1.关闭防火墙&#xff1a;systemctl …

Spring Boot - Junit4 / Junit5 / Spring Boot / IDEA 关系梳理

文章目录 PreJunit4 / Junit5 / Spring Boot / IDEAIDEA版本Spring-Boot-Older-Release-NotesSpringBootTest 起源 & Spring-Boot-1.4-Release-Notes2.0.0.RELEASE ----- 2.0.9.RELEASE2.1.0.RELEASE ----- 2.1.18.RELEASE2.2.0.RELEASE ~ 2.2.13.RELEASE2.3.0.RELEASE ~ 2…