前言
继上篇有关string类的文章,已经一个多月没有更新后续啦 上篇我们把string类的有关容量的接口了解完毕 今天我们来继续学习 string 类的一些常用接口,然后再使用一下这些好用的东西去算法习题中大战身手 跟着我的节奏,fellow me
一、string类的常用接口
1.1 string类对象的访问及遍历操作
operator[]----------------返回pos位置的字符,const string类对象调用 begin+ end--------------begin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器 rbegin + rend-----------rbegin获取最后一个字符的迭代器 + rend获取第一个字符下一个位置的迭代器 注意:
-
第一个相当于数组的 [ ],后面我们模拟实现string类的时候,会重载 [ ] 并进行使用,就是访问指定位置用的 -
后面的begin和end就是迭代器的内容,在使用swap等函数时,会用到begin和end
1.2 string类对象的修改操作
push_back -----------在字符串后尾插字符c append----------------在字符串后追加一个字符串 operator+=-----------在字符串后追加字符串str c_str-------------------返回C格式字符串 find + npos-----------从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 rfind--------------------从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 substr ----------------在str中从pos位置开始,截取n个字符,然后将其返回
注意:
- 在string尾部追加字符时,s.push_back© / s.append(1, c) / s += 'c’三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
- 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
1.3string类非成员函数
operator+ --------------------尽量少用,因为传值返回,导致深拷贝效率低 operator>> ------------------输入运算符重载 operator<<-------------------输出运算符重载 getline-------------------------获取一行字符串 relational operators---------大小比较
上面的接口了解一下就OK啦,实在想弄明白,点击就行,已经生成文档链接了 我们后续模拟实现string类的时候也会讲到
二、牛刀小试
下面来一些习题,都是有关字符串的操作的,这样能更好的熟练string类的一些接口的使用
2.1反转字母
反转字母 在 code ability 专栏已经学习过双指针的各种用法啦 本题就是使用的对撞指针 话不多说,上代码
- class Solution
- {
- public:
- bool isLetter(char ch)
- {
- if (ch >= 'a' && ch <= 'z')
- return true;
- if (ch >= 'A' && ch <= 'Z')
- return true;
- return false;
- }
- string reverseOnlyLetters(string S)
- {
- if (S.empty())
- return S;
- size_t begin = 0, end = S.size() - 1;
- while (begin < end)
- {
- while (begin < end && !isLetter(S[begin]))
- ++begin;
- while (begin < end && !isLetter(S[end]))
- --end;
- swap(S[begin], S[end]);
- ++begin;
- --end;
- }
- return S;
- }
- };
复制代码
2.2找字符串中第一个只出现一次的字符
找字符串中第一个只出现一次的字符
本题就是简单的做一个 映射关系,把 字符当做下标来看,然后从小到大遍历一遍,找到第一个1就行 类似于数据结构排序里面讲的计数排序 话不多说,上代码
- class Solution
- {
- public:
- int firstUniqChar(string s)
- {
- int count[256] = {0};
- int size = s.size();
- for(int i = 0; i < size; i++)
- {
- count[s[i]]++;
- }
- for(int i = 0; i < size; i++)
- {
- if(count[s[i]] == 1)
- return i;
- }
- return -1;
- }
- };
复制代码
2.3 字符串最后一个单词
字符串最后一个单词
这题说的是最后一个单词的长度,最直接的方法就是使用 rfind 这个接口,从后面开始遍历,直到遇到空格 另外就是输入字符串时要注意空格也要输入,所以要使用 getline 代码入下
- #include <iostream>
- using namespace std;
- int main()
- {
- string str;
- getline(cin,str);
- int pos = str.rfind(' ');
- cout<<str.size() -="" pos="" 1<<endl;="" }="" [="" code]="" <h3="">2.4验证一个字符串是否回文
- <p>验证一个字符串是否回文<br> <img src="https://i-blog.csdnimg.cn/direct/f485df7efcb14a65b57dd9ba996ed4e5.png" alt="在这里插入图片描述"><br> 本题也是对撞指针,根据题意模拟一遍就好啦<br> 然后就是处理一下大小写字符和空格<br> 话不多说,上代码</p>
- [code]class Solution
- {
- public:
- bool isPalindrome(string s)
- {
- int size = s.size();
- int left = 0, right = size - 1;
- for(int i = 0; i < size; i++)
- {
- if(s[i]>='A' && s[i] <= 'Z')
- {
- s[i] += 32;
- }
- }
- while(left < right)
- {
- while(left < right && !((s[left] <='z' && s[left] >= 'a') || (s[left] <='9' && s[left] >= '0')))
- {
- left++;
- }
- while(left < right && !((s[right] <='z' && s[right] >= 'a') || (s[right] <='9' && s[right] >= '0')))
- {
- right--;
- }
- if(s[left] == s[right])
- {
- left++;
- right--;
- }
- else
- return false;
- }
- return true;
- }
- };
复制代码
2.5 反转字符串
反转字符串 这题还是简单的,使用一个 reverse就好啦 注意: reverse 和 reserve是不一样的嗷 reverse 是 颠倒字符串 reserve 是给字符串预留空间 话不多说,上代码
- class Solution
- {
- public:
- string reverseStr(string s, int k)
- {
- int n = s.length();
- for (int i = 0; i < n; i += 2 * k)
- {
- reverse(s.begin() + i, s.begin() + min(i + k, n));
- }
- return s;
- }
- };
复制代码
2.6 反转字符串中的单词
反转字符串中的单词 这题是上一题的进阶,但是也是相对来说比较简单的 就是在上一题的基础上,多处理一下就好啦 以空格为区分界限,然后用reverse进行翻转 这里就用到了迭代器,begin 和 end
- class Solution
- {
- public:
- string reverseWords(string s)
- {
- int pos = 0;
- pos =s.find(" ",0);
- reverse(s.begin(),s.begin()+pos);
- while(1)
- {
- if(pos == s.rfind(' '))
- {
- reverse(s.begin()+pos+1,s.end());
- break;
- }
- int x = pos;
- pos = s.find(' ',pos+1);
- reverse(s.begin()+x+1,s.begin()+pos);
-
- }
- return s;
- }
- };
复制代码
2.6 字符串相加
字符串相加 这题也是有关string的 但是相比前面的题目就难处理好多,这里涉及到了字符串相加 字符串相加之前 要先处理成正常的数字,然后 再进行相加 字符串 太长也不能直接转化为整型,所以要从 后往前一个一个字符往前加 加到最前面就是最终答案,处理起来还是比较麻烦的,但是整体思路还是比较简单
话不多说,上代码
- class Solution
- {
- public:
- string addStrings(string num1, string num2)
- {
- int end1 = num1.size() - 1;
- int end2 = num2.size() - 1;
- int value1 = 0, value2 = 0, next = 0;
- string ans;
- while(end1 >= 0 || end2 >= 0)
- {
- if(end1 >= 0)
- {
- value1 = num1[end1--] - '0';
- }
- else
- value1 = 0;
- if(end2 >= 0)
- {
- value2 = num2[end2--] - '0';
- }
- else
- value2 = 0;
- int value = value1 + value2 + next; // 每一位都用 两个value进行接收然后相加 进位就用 next == 1
- if(value > 9) // 下一位相加是加上next
- {
- next = 1;
- value -=10;
- }
- else
- next = 0;
- ans+=(value + '0'); // 这里用户ans接收,相加后的数字字符,但是与正常答案是相反的
- }
- if(next == 1)
- {
- ans += '1';
- }
- reverse(ans.begin(),ans.end()); // 最后用到reverse进行反转操作 得到最终答案
- return ans;
- }
- };
复制代码
今天的有关string的习题就到这里啦
总结
今天把string类剩下的一些常用接口做了解 然后练习一些有关string的习题,加深巩固用法 下一篇博客我们就来继续加深string的学习吧 从了解,到学会,再到实现,不要走开,小编持续更新中~~~~~
|