泉州市城乡和住房建设网站,网站上传格式,呼市推广网站,wordpress 高级字段前言 处理字符串主要是有思路#xff0c;同时总结方法。 题目链接 151. 反转字符串中的单词 - 力扣#xff08;LeetCode#xff09;
55. 右旋字符串#xff08;第八期模拟笔试#xff09;
一、翻转字符串里的单词 这个题目的主要思路#xff0c;代码采用从后往前遍历字…前言 处理字符串主要是有思路同时总结方法。 题目链接 151. 反转字符串中的单词 - 力扣LeetCode
55. 右旋字符串第八期模拟笔试
一、翻转字符串里的单词 这个题目的主要思路代码采用从后往前遍历字符串的方式逐个提取单词并按反转顺序添加到新的字符串中同时妥善处理了空格相关的问题最终得到符合要求的输出字符串。 具体步骤 初始化与循环准备首先获取输入字符串 s 的长度并将用于遍历字符串的索引 i 初始化为字符串最后一个字符的位置i s.size() - 1。同时创建一个空字符串 ans用来存储最终处理好的结果。 外层循环处理每个单词通过 while(i 0) 这个外层循环来依次处理字符串中的每个单词。从字符串末尾开始向前遍历这个循环会持续执行直到整个字符串都被处理完也就是 i 小于 0 时结束。 跳过末尾空格在每次开始处理一个新的可能的单词前有一个内层的 while 循环 while(i 0 s[i] ) --i;它的作用是跳过字符串末尾连续出现的空格。比如字符串最后可能跟着多个空格要先把这些空格跳过找到真正最后一个单词的最后一个字符位置。 确定单词长度紧接着另一个内层 while 循环 while(i 0 s[i]! ) --i, c;这个循环从刚才跳过空格后的位置开始继续向前遍历只要当前字符不是空格意味着还处于同一个单词内就继续向前移动索引 i同时用计数器 c 记录当前单词的字符个数。例如对于单词 blue这个循环会统计出它包含 4 个字符。 提取并添加单词到结果字符串如果计数器 c 不为 0说明找到了一个有效的单词那么通过 s.substr(i 1, c) 提取出这个单词substr 函数用于截取从指定位置开始、指定长度的子字符串这里 i 1 是因为刚才循环结束时 i 指向单词的前一个位置所以要加 1 才是单词开始的正确位置c 就是单词的长度并把这个单词添加到结果字符串 ans 中同时在单词后面添加一个空格ans s.substr(i 1, c) ;方便后续区分不同单词。 去除最后多余的空格当整个字符串都处理完后通过 return ans.substr(0, ans.size() - 1); 返回最终结果。由于在添加每个单词时都额外添加了一个空格最后结果字符串末尾会多一个空格所以这里通过截取字符串去掉最后这个多余的空格只返回前面正确处理好的内容也就是完成了单词反转并且格式整理好的字符串。 string reverseWords(string s) {int is.size()-1;string ans;while(i0){int c0;while(i0s[i] )--i;while(i0s[i]! )--i,c;if(c)anss.substr(i1,c) ;}return ans.substr(0,ans.size()-1);} 二、右旋转字符串 思路先逆序翻转然后再翻转前N个字符串再翻转后面的。 //逆序翻转
#includeiostream
#includealgorithm
using namespace std;
int main() {int n;string s;cin n;cin s;int len s.size(); //获取长度reverse(s.begin(), s.end()); // 整体反转reverse(s.begin(), s.begin() n); // 先反转前一段长度nreverse(s.begin() n, s.end()); // 再反转后一段cout s endl;
}
总结 对于字符串的处理 遍历方式 正向遍历按顺序从开头到结尾访问字符适用于常规顺序处理。 反向遍历从末尾往开头遍历便于处理与结尾相关或需逆序操作的情况。 双指针遍历两指针依规则同步或异步移动用于对比、处理对应字符如判断回文。 字符操作 比较判断字符是否为特定类型依结果执行不同逻辑。 转换进行大小写、字符与数值等转换便于后续处理。 替换与删除按需对字符替换或删除。 子字符串处理 提取截取子字符串用于进一步分析。 查找判断是否包含特定子字符串。 辅助数据结构 栈用于顺序反转、暂存符合后进先出特点的内容。 队列按先进先出顺序处理相关元素。 哈希表高效统计字符、子字符串出现情况等。 动态规划用于存在最优子结构性质的复杂问题通过定义状态与状态转移方程求解最优解。