目录
1.仅仅反转字母
2.字符串中的第一个唯一字符编辑
3.字符串最后一个单词的长度
4.替换空格
1.仅仅反转字母
我们可以定义两个变量来表示数组首尾位置的有效字符的下标,然后分别从前和从后向中间遍历,只要遇到字母就停下来,利用库函数swap进行交换。
class Solution {
//先写一个判断是字母的函数
bool panduan(char ch)
{
if(ch>='a'&&ch<='z')
return true;
if(ch>='A'&&ch<='Z')
return true;
return false;
}
public:
string reverseOnlyLetters(string s) {
size_t begin=0, end =s.size()-1;
//这里是数组下标,所以要-1
while(begin<end)
{
//如果是字母就停下来交换,不是就一直往后走找字母,
while(begin<end && !panduan(s[begin]))
begin++;
while(begin<end && !panduan(s[end]))
end--;
swap(s[begin++],s[end--]);
}
return s;
}
};
2.字符串中的第一个唯一字符
这个题就是找没有出现过字符的下标
class Solution {
public:
int firstUniqChar(string s) {
//出现的次数就统计出来了
int count[26]={0};
for(auto ch: s)
{
count[ch-'a']++;
}
for(int i = 0; i <s.size(); i++)
{
if(count[s[i]-'a']==1)
return i;
}
return -1;
}
};
3.字符串最后一个单词的长度
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
getline(cin,str);//提取的时候不会被空格影响,只会被\0影响
size_t pos =str.rfind(' ');
if(pos!=string::npos) //pos返回失败是npos
{
cout<<str.size()-pos-1<<endl;
//左闭右开求的就是实际长度,因为有空格要把空格删掉
}
else { //没有空格的情况,直接返回size
cout<<str.size()<<endl;
}
}
这道题可以利用getline(不会被空格影响)来获取一行的字符串,然后通过rfind函数找到最后一个单词前面空格的位置,最后用size的大小(实际是最后一个的下一个位置)减去空格位置的下标,再减1,因为两个下标做差求的是区间的个数,要求区间中字符的个数需要多减去1.