做一个公司的网站应做哪些准备工作,品牌网址注册,有哪些可以建设网站的单位,做矿产公司的网站目录 一、字符串最后一个单词的长度
题目描述
完整代码
二、验证回文串
题目描述
完整代码
三、反转字符串
题目描述
完整代码
四、反转字符串中的单词
题目描述
完整代码 一、字符串最后一个单词的长度
原题链接
题目描述 计算字符串最后一个单词的长度#xff…目录 一、字符串最后一个单词的长度
题目描述
完整代码
二、验证回文串
题目描述
完整代码
三、反转字符串
题目描述
完整代码
四、反转字符串中的单词
题目描述
完整代码 一、字符串最后一个单词的长度
原题链接
题目描述 计算字符串最后一个单词的长度单词以空格隔开字符串长度小于5000。注字符串末尾不以空格为结尾 输入描述 输入一行代表要计算的字符串非空长度小于5000。 输出描述 输出一个整数表示输入字符串最后一个单词的长度。 按照题目要求我们需要找到字符串中的最后一个单词我的想法是从字符串的最后一个字符开始向前遍历直到遇到空格为止那么怎么实现遍历呢我们可以用迭代器指向最后一个字符这里用到一个string的成员函数 rbegin() 它的作用是创建一个指向字符串最后一个字符的反向迭代器我们创建一个 it 变量用于接受迭代器的内容。 由于声明一个迭代器类型比较麻烦因为类型名字通常比较长所以可以用到auto关键字对 it 进行定义auto it input::rbegin() 。此时对it进行 * 解引用就可以获取当前指向的字符这样就可以实现对字符的判空迭代器it则指向它之前的字符。了解了这些我们就可以做题了。 不过还有一个问题题目要求的并不是接口实现需要我们自行存储输入样例但是用cin输入字符串时编译器遇到空格就停止也就是说怎么存储一个带有多个空格的字符串成了问题。这里可以用C标准库的getline函数用于从输入流例如std::cin中读取一行文本。下面是它的标准用法
std::getline(input_stream, str, delimiter);完整代码
#include iostream
#includestring
using namespace std;int main() {string input;getline(cin, input);int answer 0;for (auto it input.rbegin(); *it ! ; it) {answer;if (answer input.size()) {cout input.size();return 0;}}cout answer endl;
}
二、验证回文串
原题链接
题目描述 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s如果它是 回文串 返回 true 否则返回 false 。 示例 1 输入: s A man, a plan, a canal: Panama
输出true
解释amanaplanacanalpanama 是回文串。示例 2 输入s race a car
输出false
解释raceacar 不是回文串。示例 3 输入s
输出true
解释在移除非字母数字字符之后s 是一个空字符串 。
由于空字符串正着反着读都一样所以是回文串。 按题目要求我们需要对字符串从前往后以及从后往前分别遍历判断两次遍历内容是否相同观察实例可以发现字符无关大小写所以我们需要统一字符的大小写这里统一成小写这里用到C标准库函数 tolower用于将字符串转化成小写形式。其原型如下
int tolower(int c);该函数接受一个整数参数 c该参数代表一个字符。如果该字符是大写字母则 tolower 返回相应的小写字母的ASCII码值否则它原样返回。再通过基于范围的for循环来对字符串每个字符进行遍历并对其进行修改。 大小写的问题解决了但是字符串还要再进行进一步的处理根据例题回文串是不考虑标点符号和空格的所以我们还需要把字符串中空格和标点的部分进行删除只保留字母部分下面先给出这一部分的代码
s.erase(std::remove_if(s.begin(), s.end(), [](char c) {return std::ispunct(c) || std::isspace(c);}),s.end()
); std::remove_if: 这个函数用于对指定范围内的元素进行重新排列使满足给定谓词条件由 lambda 函数指定的元素移到范围的末尾。它实际上并不删除元素只是将它们移到末尾。 Lambda 函数 [](char c) { return std::ispunct(c) || std::isspace(c); } 是一个谓词对于是标点符号或空格字符的字符返回 true。 std::remove_if 的结果作为第一个参数传递给 s.erase 函数该函数用于从字符串中擦除指定范围的元素。
经过上述步骤字符串就处理完成了接下来就是对字符串分别进行先序和后序遍历通过定义两个个string对象分别讲先序和后序的结果赋值给他们然后进行比较。
完整代码
class Solution {
public:bool isPalindrome(string s) {for (char x : s) { //大写转小写x tolower(x);}s.erase(remove_if(s.begin(), s.end(), [](char c) { //删去标点符与空格符return std::ispunct(c) || std::isspace(c); }), s.end());string a1(s.begin(), s.end());string a2(s.rbegin(), s.rend());if (a1 a2) {return 1;}return 0;}
};
三、反转字符串
原题链接
题目描述 给定一个字符串 s 和一个整数 k从字符串开头算起每计数至 2k 个字符就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个则反转前 k 个字符其余字符保持原样。 示例 1 输入s abcdefg, k 2
输出bacdfeg示例 2 输入s abcd, k 2
输出bacd 根据题目要求首先需要遍历字符串我们用一个迭代器来实现遍历还需要记录遍历的个数用flag表示当遍历了2k个字符时对前k个进行翻转翻转的操作我们可以通过库函数 reverse 实现每进行一次翻转操作后将flag置0。
完整代码
class Solution {
public:string reverseStr(string s, int k) { //翻转前2k个字符的前k个字符int flag 0;auto begin s.begin();for (auto x s.begin(); x ! s.end(); x) {flag;if (flag 2 * k) {reverse(begin, x1-k);begin x 1;flag 0;}}if (flag k) {reverse(begin, s.end());}else {reverse(begin, begin k);}return s;}
}; 为什么这里reverse内的参数是begin和x1-k呢原因是reverse内部第二个迭代器参数其实指向的是字符串最后一个元素的后一位而x此时指向的是2k个元素中的第2k个元素所以需要1再-k才能实现对前k个元素的翻转。
四、反转字符串中的单词
原题链接
题目描述 给定一个字符串 s 你需要反转字符串中每个单词的字符顺序同时仍保留空格和单词的初始顺序。 示例 1 输入s Lets take LeetCode contest
输出steL ekat edoCteeL tsetnoc示例 2: 输入 s Mr Ding
输出rM gniD 这道题目与上一道类似只不过翻转的范围变成了字符串中的每个单词那么只需要通过遍历找到空格的位置即上一道题目找到第2k个位置类似然后进行翻转同样需要flag来标记遍历的个数以及一个left迭代器标记遍历的起始位置。
完整代码
class Solution {
public:string reverseWords(string s) {auto left s.begin();for (auto right s.begin(); right ! s.end(); right){if (*right ) { //碰到空格开始翻转reverse(left, right);left right 1;}}reverse(left, s.end());return s;}
}; 这四道题目考验了有关迭代器string以及部分库函数的知识点通过这四道例题我们可以对迭代器的运用有更深入的了解。