string---入门OJ题(2) 917. 仅仅反转字母 - 力扣LeetCode本题用双指针指向一前一后然后分别各自找到英文字符swap一下唯一注意点就是指针越界问题。class Solution { public: string reverseOnlyLetters(string s) { int left 0, right s.size() - 1; while(left right) { while(left right !((s[left] a s[left] z) || (s[left] A s[left] Z))) left; while(left right !((s[right] a s[right] z) || (s[right] A s[right] Z))) --right; if(left right) swap(s[left], s[right]); left; --right; } return s; } };387. 字符串中的第一个唯一字符 - 力扣LeetCode利用哈希表的思想创建一个数组下标映射26个字母然后便利一遍字符串记录下里边每一个字符出现的次数然后再便利一次字符串并去查看hash表找到第一个值为1的就是答案。注意这里第一个唯一字符是按题目给的字符串从前往后第一个唯一的而不是英文字母表里的顺序。所以统计完次数之后便利的不是哈希数组而是字符串。class Solution { public: int firstUniqChar(string s) { int hash[26] {0}; //统计次数 for(int i 0;i s.size();i) { hash[s[i] - a]; } for(int i 0;i s.size();i) { if(hash[s[i] - a] 1) return i; } return -1; } };125. 验证回文串 - 力扣LeetCode先便利一遍字符串按照题目要求先将大写字符转小写并且将所有非字母字符去掉之后的字符拼成一个新的字符串然后就直接反转看看跟原来的字符串相不相等就知道是不是回文串了。class Solution { public: bool isLetter(char ch) { if(ch a ch z) return true; if(ch A ch Z) return true; if(ch 0 ch 9) return true; return false; } bool isPalindrome(string s) { string tmp; for(int i 0;i s.size();i) { if(isLetter(s[i])) { if(s[i] A s[i] Z) s[i] 32;//大写转小写 tmp s[i]; } else { //不是字母直接continue continue; } } string rev tmp; reverse(tmp.begin(), tmp.end()); if(rev tmp) return true; return false; } };344. 反转字符串 - 力扣LeetCode题目要求必须原地修改用双指针直接搞定。class Solution { public: void reverseString(vectorchar s) { int left 0, right s.size() - 1; while(left right) { swap(s[left], s[right]); left; --right; } } };415. 字符串相加 - 力扣LeetCode字符串模拟加法的过程先说一下大数运算以本题举例字符串长度最大是10000普通longlong能存的数字最多18位很明显用字符串能存很大的整数。本题解法就是模拟整数加法过程的过程以45677举例子。列竖式模拟加法注意1别忘处理进位和最高位进位的情况加的时候是从后往前加。注意2便利字符串的时候要走完全部的字符串不能短的走完就出循环了。因为可能有下边图片里的进位情况。注意3由于是字符底层会用其ASCII码去加所以要先将字符转化成整数很简单数字字符-0就能得到整数。注下边的代码里还有可优化的地方由于insert的效率太低ans可以尾插然后最后reverse一下还有一个点就是在定义ans的时候提前给它reserve一下避免频繁扩容。reserve(max(num1.size(), num2.size()))。class Solution { public: string addStrings(string num1, string num2) { int num1_l num1.size() - 1; int num2_l num2.size() - 1; string ans;//结果字符串 int carry 0;//存储进位 while(num1_l 0 || num2_l 0) { //有可能进循环的时候num1_l或者num2_l已经有一个0了所以要额外判断一下 int val1 num1_l 0 ? num1[num1_l] - 0 : 0; int val2 num2_l 0 ? num2[num2_l] - 0 : 0; int val (val1 val2 carry) % 10; carry (val1 val2 carry) / 10; ans.insert(ans.begin(), (val 0));//注意是头插 --num1_l; --num2_l; } //有可能最高位还会有进位 if(carry 0) ans.insert(ans.begin(), (carry 0)); return ans; } };字符串最后一个单词的长度_牛客题霸_牛客网我们可以先用getline读取一整行字符串然后rfind找空格substr截取最后一个字符串最后算它的长度即可。#includeiostream using namespace std; int main() { string str; getline(cin, str); size_t ref str.rfind( ); if(ref string::npos) { //如果没找到空格说明只有一个字符串 cout str.size(); } else { cout str.substr(ref1).size(); } return 0; }找出字符串中第一个只出现一次的字符_牛客题霸_牛客网思路跟上边有道题一模一样。#includeiostream using namespace std; int main() { string s; cin s; int hash[26] {0}; //统计每个单词出现的次数 for(auto e : s) { hash[e - a]; } int i 0; int flag 0; for(i 0;i s.size();i) { if(hash[s[i] - a] 1) { cout s[i]; flag 1; break; } } if(flag 0) cout -1; return 0; }LCR 192. 把字符串转换成整数 (atoi) - 力扣LeetCode根据题目要求直接写。注意不要以删除前导0的方式处理它(将原字符串去掉0之后拼成一个新的字符串)因为有可能字符串内部也有0会被你一并处理掉比如说0102301直接处理成了1231直接就错了。class Solution { public: int myAtoi(string s) { int n s.size(); int idx 0;//索引 long long num 0; int sign 1; // 1正 -1负 // 1. 跳过前导空格 while (idx n s[idx] ) { idx; } // 2. 判断正负号 if (idx n (s[idx] || s[idx] -)) { if (s[idx] -) sign -1; idx; } // 3. 读取连续数字遇到非数字停止 //num定义成longlong是因为如果最大int值溢出就会变成负数我就不知道是不是越界了 //因为题目给的字符串转为整数的范围[−2^31, 2^31 − 1]是int的范围 //用longlong暂存就不会有问题 while (idx n isdigit(s[idx])) { int digit s[idx] - 0; num num * 10 digit; // 提前溢出判断防止long long过大 //为什么用INT_MAX因为题目给的myAtoi函数的返回值是int if (sign 1 num INT_MAX) { return INT_MAX; } //INT_MIN为-2^31绝对值为2^31正好就是INT_MAX1 //因为符号是最后处理的所以这里全是正数就这么写 if (sign -1 num (long long)INT_MAX 1) { return INT_MIN; } idx; } return sign * num; } };541. 反转字符串 II - 力扣LeetCode根据题目意思每次处理的就是每2k个字符串的前k个所以首先我们可以以2k为单位去便利字符串。每次循环进来处理的是k个字符反转一下自己写或者用库函数都可以。还有两种特殊情况要判断这个在代码里用注释的形式体现。class Solution { public: string reverseStr(string s, int k) { for (int i 0; i s.size(); i (2 * k)) { // 1. 每隔 2k 个字符的前 k 个字符进行反转 // 2. 剩余字符小于 2k 但大于或等于 k 个则反转前 k 个字符 if (i k s.size()) { reverse(s.begin() i, s.begin() i k ); continue; } //3.到这i k s.size()说明剩余字符都不足k个则将剩余字符全部反转。 reverse(s.begin() i, s.begin() s.size()); } return s; } };557. 反转字符串中的单词 III - 力扣LeetCodefind找到空格然后reverse一下再继续往下找。class Solution { public: string reverseWords(string s) { //先处理第一个字符串因为它的开头没有空格不好在循环里搞 size_t rr s.find( ); if(rr ! string::npos) { reverse(s.begin(), s.begin() rr); } size_t pos rr; while((rr s.find( , pos 1)) ! string::npos) { reverse(s.begin() pos 1, s.begin() rr); pos rr; } //处理最后一个字符串 reverse(s.begin() pos 1, s.begin() s.size()); return s; } };43. 字符串相乘 - 力扣LeetCode跟上边的字符串相加那题差不多本题是模拟乘法的过程。这里的乘法跟小学学的乘法不一样我们采取先乘再处理进位的方式。具体看下图的模拟。根据上图存入数组的顺序应为182728134。所以从前往后处理进位然后将结果拼接到一个新的字符串里最后别忘逆序一下字符串。class Solution { public: string multiply(string num1, string num2) { //逆序字符串 int m1 num1.size(); int m2 num2.size(); reverse(num1.begin(), num1.end()); reverse(num2.begin(), num2.end()); //将每一位相乘的结果存入数组 //两个数相乘的结果的位数最多就它们的位数之和 vectorint v(m1 m2, 0); //对应位置相乘相加 for(int i 0;i m1;i) { //将对应位置转化成数字 int x num1[i] - 0; for(int j 0;j m2;j) { int y num2[j] - 0; v[i j] x * y;//用是因为对应位置不止一个数字要加进去 } } //处理进位 for(int i 0;i v.size();i) { //先存进位不然v[i]v[i]/10早就覆盖了原来的值 int carry v[i] / 10; v[i] v[i] % 10; if(i 1 v.size()) v[i 1] carry; } string ans; for(auto e : v) { ans (e 0); } reverse(ans.begin(), ans.end()); //处理前导0因为v的大小是开的最大情况有可能实际情况没这么大 //所以可能有前导0的情况由于相乘结果就可能是0所以还需要保留 //一个0作为结果所以要判断一下i ans.size()的情况 int i 0; while(ans[i] 0 i ans.size()) i; string ret;//结果拼接到ret里 for(int j i;j ans.size();j) { ret ans[j]; } // 特殊情况全部是0返回0而非空串 return ret.empty() ? 0 : ret; } };

相关新闻

最新新闻

基于 Pnpm Workspace 与 Vite 搭建 Vue 3 企业级 Monorepo 项目

基于 Pnpm Workspace 与 Vite 搭建 Vue 3 企业级 Monorepo 项目

1. 为什么选择 Pnpm Vite Vue 3 组合?在开始搭建企业级 Monorepo 项目之前,我们需要理解为什么这个技术组合如此受欢迎。Pnpm 作为包管理工具,相比传统的 npm 和 yarn 有着明显的优势。它通过硬链接和符号链接的方式共享依赖,不…

2026/7/15 5:59:01
DoIP(六)—— 以太网诊断的时序挑战与参数调优

DoIP(六)—— 以太网诊断的时序挑战与参数调优

1. 以太网诊断的时序挑战从何而来第一次接触车载以太网诊断的工程师,往往会被各种时间参数搞得晕头转向。这就像从乡间小路突然开上高速公路——CAN总线环境下习以为常的时序规则,在以太网场景下突然变得捉襟见肘。根本原因在于两种网络架构的本质差异&a…

2026/7/15 5:59:01
第一章 无人机入门(二):从飞控到机载电脑的软件协同架构

第一章 无人机入门(二):从飞控到机载电脑的软件协同架构

1. 无人机软件系统的分层架构第一次接触无人机软件系统时,很多人会被各种术语绕晕。其实无人机的软件架构就像人体的神经系统,可以简单分为三层:底层飞控固件(小脑)、中间件通信协议(脊髓神经)、…

2026/7/15 5:59:01
C#实现ModbusRTU详解【二】—— 解析响应报文

C#实现ModbusRTU详解【二】—— 解析响应报文

1. ModbusRTU响应报文基础解析当你用C#发送完ModbusRTU读取请求后,设备返回的响应报文就像一封装满数据的快递包裹。拆解这个包裹需要遵循特定规则,否则就会像拆错快递一样尴尬。响应报文的标准结构是这样的:[站地址][功能码][数据字节数][数…

2026/7/15 5:59:01
计算机网络期末复习:从MOOC习题到实战思维导图

计算机网络期末复习:从MOOC习题到实战思维导图

1. 从MOOC习题到思维导图:构建高效复习体系华南理工大学的计算机网络MOOC课程以"7张思维导图"为核心学习方法,这恰恰是期末复习的最佳切入点。我当年备考时发现,直接刷题容易陷入"只见树木不见森林"的困境,而…

2026/7/15 5:59:01
知识库不是仓库,而是认知代谢系统

知识库不是仓库,而是认知代谢系统

1. 这不是建仓库,是养一个会思考的“第二大脑” “AI发达的今天你是如何建立自己的知识库的?如何让它不只是一个知识仓库?”——这句话我第一次看到时,在笔记本上划掉了后半句的问号,改成了句号。因为真正做过三年以上…

2026/7/15 5:54:01

月新闻