【C++】string类的使用,小试牛刀
🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
一、前提
为什么会出现string类? C语言中,字符串是以 结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数始于字符串是分离开的,不太符合OOP面向对象的思想,而且底层空间需要用户自己管理,稍不留神还会越界访问,所以出现了string类
二、对string类的应用、小试牛刀
1.字符串的逆置
对于这道题,就是判断是不是字母以及停止的条件
class Solution { public: string reverseOnlyLetters(string s) { if(s.size()==0||s.size()==1) return s; int left=0; int right= s.size()-1; while(left<right) { while(left<right&&!isalpha(s[left])) left++; while(left<right&&!isalpha(s[right])) right--; swap(s[left++],s[right--]); } return s; } };
2.字符串相加
用一个字符串来存储每位的值,然后最后使用一个自带的逆置,reverse需要传的是迭代区间
class Solution { public: string addStrings(string num1, string num2) { int rbegin1 = num1.size()-1; int rbegin2 = num2.size()-1; string target; int mod = 0; while(rbegin1>=0||rbegin2>=0||mod) { if(rbegin1>=0) { mod+=(num1[rbegin1]-0); rbegin1--; } if(rbegin2>=0) { mod+=(num2[rbegin2]-0); rbegin2--; } int tmp=mod%10; target+=(tmp+0); mod/=10; } reverse(target.begin(),target.end()); return target; } };
3.字符串最后一个单词的长度
使用cin<<str的话,不会接受空格,解决办法: 1.scanf(“%[^某个符号位置]”); 2.getline(istream&in , str)
#include <iostream> #include <string> using namespace std; int main(){ //getline //scanf("%[^某个字符]"); string str; getline(cin,str); size_t posEnd; for(int i= str.size()-1;i>=0;i++) { if(isalpha(str[i])) { posEnd=i; break; } } size_t posBegin= str.rfind( ,posEnd); cout<<posEnd-posBegin<<endl; return 0; }
4.字符串中第一个的唯一字符
class Solution { public: //下面这中方法时间复杂度O(N^2) //最好的还是遍历一遍,用计数的方法 int firstUniqChar(string s) { for(int i=0;i<s.size();i++) { int pos1 = s.find(s[i]); int pos2 = s.rfind(s[i]); if(pos1==pos2) return i; } return -1; } };
三、总结
学到的知识需要应用起来才能知道自己掌握,多做题对于现在的我们而言是很有帮助的,感谢大家的支持,大家一起共同进步!