目录
1.删除公共字符
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。
例如:第一个字符串是"They are students.",第二个字符串是”aeiou"。删除之后的第一个字符串变成"Thy r stdnts."。
保证两个字符串的长度均不超过100。
#include <iostream>
#include<string>
using namespace std;
int main() {
string a, b;
while (getline(cin, a) && getline(cin, b)) { // 注意 while 处理多个 case
string::iterator it = a.begin();
while (it != a.end())
{
size_t pos = a.find_first_of(b);
if (pos != string::npos)
{
a.erase(a.begin()+pos);
}
else
{
break;
}
}
cout << a;
}
return 0;
}
为防止遇到空格结束提取,使用getline函数提取字符串,然后使用迭代器遍历a字符串,使用find_last_of函数查找属于b字符串字符的pos位置,erase函数删除a.begin()+pos位置迭代器所指向的字符,如果pos不到npos说明没有删除完,pos==npos则删除完毕。
2.字符串相加
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger
), 也不能直接将输入的字符串转换为整数形式。
class Solution {
public:
string addStrings(string num1, string num2) {
int flag = 0;
char ret1 = '0';
char ret2 = '0';
string num3 = "";
while (!num1.empty() || !num2.empty())
{
if (num1.empty())
{
ret1 = '0';
}
else
{
ret1 = num1.back();
num1.pop_back();
}
if (num2.empty())
{
ret2 = '0';
}
else
{
ret2 = num2.back();
num2.pop_back();
}
char ch='0';
int add = ret1 - '0' + ret2 - '0' + flag;
if (add >= 10)
{
flag = 1;
ch = add % 10 + 48;
}
else
{
ch = add % 10 + 48;
flag = 0;
}
num3.push_back(ch);
}
if(flag==1)
num3.push_back('1');
reverse(num3.begin(),num3.end());
return num3;
}
};
每次取字符串的最后一位进行运算,字符数字减去 '0'转换为数字,flag表示进位,将add取模10再加'0'push_back()到结果字符串中,因为是尾插,最后反转num3得到结果。
3.验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
class Solution {
public:
bool isPalindrome(string s) {
for (char& e : s)
{
if (e <= 'Z' && e >= 'A')
{
e += 32;
}
if ((e > '9' || e < '0') && (e < 'a' || e>'z'))
{
e = '\0';
}
}
string s1 = "";
for (char e : s)
{
if (e != '\0')
{
s1.push_back(e);
}
}
string s2 = s1;
reverse(s2.begin(), s2.end());
if (strcmp(s2.c_str(),s1.c_str())==0)
{
return true;
}
else
{
return false;
}
}
};
移除不符合要求的字符后,将s1复制一份s2;然后反转s2,使用strcmp函数比较s1和s2的_str是否相同。
4. 反转字符串 II
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
class Solution {
public:
string reverseStr(string s, int k) {
int len=s.size();
for(int i=0;i<len;i+=2*k)
{
if(i+k<len)
{
reverse(s.begin()+i,s.begin()+i+k);
}
else
{
reverse(s.begin()+i,s.end());
}
}
return s;
}
};
5.反转字符串中的单词 III
给定一个字符串 s
,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = "Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc"
class Solution {
public:
string reverseWords(string s) {
size_t pos = 0;
size_t prev_pos = 0;
while ((pos = s.find_first_of(' ', pos))!= string::npos)
{
reverse(s.begin() + prev_pos, s.begin() + pos);
prev_pos = ++pos;
}
reverse(s.begin()+ prev_pos, s.end());
return s;
}
};
pos位置表示空格位置,prev_pos表示上一个空格的后一个位置,也就是下一个单词的开始位置,每次交换pos和prev_pos区间即可,并且更新prev_pos位置。最后反转prev_pos位置到结尾区间,也就是最后单词。
6.字符串相乘
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
class Solution {
public:
string multiply(string num1, string num2) {
if(num1=="0"||num2=="0")
return "0";
int n=num1.size()-1,m=num2.size()-1;
string ans="0";
for(int i=n;i>=0;i--)
{
string cur="";
for(int j=n;j>i;j--)
{
cur.push_back('0');
}
int num=num1.at(i)-'0';
int sign=0;
for(int i=m;i>=0;i--)
{
int a=(num*(num2.at(i)-'0'))+sign;
sign=a/10;
cur.push_back(a%10+'0');
}
if(sign!=0)
{
cur.push_back(sign+'0');
}
reverse(cur.begin(),cur.end());
ans=addStrings(ans,cur);
}
return ans;
}
string addStrings(string num1, string num2) {
int flag = 0;
char ret1 = '0';
char ret2 = '0';
string num3 = "";
while (!num1.empty() || !num2.empty()||flag!=0)
{
if (num1.empty())
{
ret1 = '0';
}
else
{
ret1 = num1.back();
num1.pop_back();
}
if (num2.empty())
{
ret2 = '0';
}
else
{
ret2 = num2.back();
num2.pop_back();
}
char ch='0';
int add = ret1 - '0' + ret2 - '0' + flag;
if (add >= 10)
{
flag = 1;
ch = add % 10 + 48;
}
else
{
ch = add % 10 + 48;
flag = 0;
}
num3.push_back(ch);
}
reverse(num3.begin(),num3.end());
return num3;
}
};
每次取num1的最后一位当作乘数,然后乘被乘数,得到的结果存在cur中,注意每一次取num1的一位,要在cur后补0,最后调用字符串加法函数,将每一位乘法的结果也就是cur累加起来,最后反转字符串得到结果。
7.字符串最后一个单词的长度
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
#include <iostream>
using namespace std;
int main() {
string s;
getline(cin,s);
size_t pos=0;
size_t prev_pos=0;
while((pos=s.find_first_of(' ',pos))!=string::npos)
{
prev_pos=++pos;
}
int count=0;
while(prev_pos++!=s.size())
{
count++;
}
cout<<count;
return 0;
}
与第5题思想一致, while((pos=s.find_first_of(' ',pos))!=string::npos);while循环后pos指向末尾。prev_pos记录最后一个单词开始位置,累加count得到最后一个单词长度。