string练习题
1.仅仅反转字母
反转字母题目链接
我们使用 left 指针从左边开始扫描字符串 s,right 指针从右边开始扫描字符串 s。如果两个指针都扫描到字母,且 left<right,那么交换 s[left] 和 s[right],然后继续进行扫描;否则表明反转过程结束,返回处理后的字符串。
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.字符串里面最后一个单词的长度
字符最后一个单词长度
使用cin直接读入字符串会在遇到第一个空格时就停止,导致读入出错。使用getline()方法读入整行内容。再从后往前遍历,遇到第一个空格就停止,此时遍历了最后一个单词,输出对应的遍历的次数即可。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string line;
// 不要使用cin>>line,因为会它遇到空格就结束了
// while(cin>>line)
while(getline(cin, line))
{
size_t pos = line.rfind(' ');
cout<<line.size()-pos-1<<endl;
}
return 0;
}
3.验证一个字符串是否是回文
验证回文串
最简单的方法是对字符串 s 进行一次遍历,并将其中的字母和数字字符进行保留,放在另一个字符串 sgood 中。这样我们只需要判断 sgood 是否是一个普通的回文串即可。
判断的方法有两种。第一种是使用语言中的字符串翻转 API 得到 sgood 的逆序字符串 sgood_rev,只要这两个字符串相同,那么 sgood 就是回文串。
class Solution {
public:
bool isLetterOrNumber(char ch)
{
return (ch >= '0' && ch <= '9')
|| (ch >= 'a' && ch <= 'z')
|| (ch >= 'A' && ch <= 'Z');
}
bool isPalindrome(string s) {
// 先小写字母转换成大写,再进行判断
for (auto& ch : s)
{
if (ch >= 'a' && ch <= 'z')
ch -= 32;
}
int begin = 0, end = s.size() - 1;
while (begin < end)
{
while (begin < end && !isLetterOrNumber(s[begin]))
++begin;
while (begin < end && !isLetterOrNumber(s[end]))
--end;
if (s[begin] != s[end])
{
return false;
}
else
{
++begin;
--end;
}
}
return true;
}
};
4.字符串相加
字符串相加
本题我们只需要对两个大整数模拟「竖式加法」的过程。竖式加法就是我们平常学习生活中常用的对两个整数相加的方法,回想一下我们在纸上对两个整数相加的操作,是不是如下图将相同数位对齐,从低到高逐位相加,如果当前位和超过 10,则向高位进一位?因此我们只要将这个过程用代码写出来即可。
class Solution {
public:
string addStrings(string num1, string num2) {
int n1 = num1.size() - 1;
int n2 = num2.size() - 1;
int next = 0;
string str = "";
while (n1 >= 0 || n2 >= 0)
{
int x1 = n1 >= 0 ? num1[n1--] - '0' : 0;
int x2 = n2 >= 0 ? num2[n2--] - '0' : 0;
int x = x1 + x2 + next;
//进位
next = x / 10;
//取值
x = x % 10;
str += (x + '0');
}
if (next == 1)
{
str += (1 + '0');
}
reverse(str.begin(), str.end());
return str;
}
};
5.加餐练习
课后作业练习——翻转字符串II
课后作业练习——翻转字符串III
课后作业练习——字符串相乘
课后作业练习——找出字符串中第一个只出现一次的字符