【C++】String类经典OJ题目分析
2023-12-15 04:31:06
字符串相加
链接: link
class Solution {
public:
string addStrings(string num1, string num2) {
int next = 0;//存放进位
int end1 = num1.size()-1;
int end2 = num2.size()-1;
int ret = 0;
string str;//存放相加后的结果
while(end1>=0||end2>=0)
{
int x1 = end1>=0?num1[end1]-'0':0;
int x2 = end2>=0?num2[end2]-'0':0;
ret=x1+x2+next;
next = ret/10;
ret = ret%10;
str+=(ret+'0');
end1--;
end2--;
}
if(next==1)
{
str+='1';
}
reverse(str.begin(),str.end());
return str;
}
};
本题要点:
1、两个存放数字的字符串相加,需要向最高位进位,定义next进位位。
2、定义两个尾指针分别指向num1和num2的最后一个字符(不是\0)。
3、循环结束条件以两个字符串中最长的为主,所以循环条件判断使用或运算符,定义两个相加变量时使用三目运算符,这个地方设计的很巧妙。
4、循环结束时如果进位位是1,则str+=1。
5、计算结束后使用reverse逆置得到相加后的字符串。(不使用insert,因为要挪动数据,开销大)
字符串里面最后一个单词的长度
链接: link
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1;
getline(cin,str1);
size_t i = str1.rfind(' ');
if(i!=string::npos)
{
string str2 = str1.substr(i+1);
cout<<str2.size()<<endl;
}
else
{
cout<<str1.size()<<endl;
}
}
本题要点
1、不能使用cin输入一行字符串,因为不能确保该字符串当中是否有空格 getline(cin,str1)(类似于scanf)
2、使用string类中的rfind函数找到最后一个空格,i记录该空格的下标,substr截取第i+1个位置开始到结尾的字符(即最后一个单词)
反转字符串||
链接: link
class Solution {
public:
void Reverse(string &s, int start, int end)
{
char tmp;
end--;
while(start < end)
{
tmp = s[start];
s[start] = s[end];
s[end] = tmp;
start++;
end--;
}
}
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, i, i+k);
else
Reverse(s, i, len);
}
return s;
}
};
本题要点: 1、如果剩余字符少于 k 个,则将剩余字符全部反转。也就是说,如果i的位置再加上k超过了len,就将从i的位置开始剩余所有字符串全部反转。
2、如果剩余字符小于 2k但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。这样的话就执行题目中的每计数2k个字符就反转前k个字符。
反转字符串中的单词
链接: link
class Solution {
public:
void Reverse(string &s,int start,int end)
{
char tmp;
while(start<end)
{
tmp = s[start];
s[start]=s[end];
s[end]=tmp;
start++;
end--;
}
}
string reverseWords(string s) {
size_t start = 0;
size_t end =0;
while(start<s.size())
{
end=s.find(' ',start);
if(end==string::npos)
{
end = s.size();
break;
}
Reverse(s,start,end-1);
start=end+1;
}
Reverse(s,start,end-1);
return s;
}
};
本题要点:
1、先找空格再将单词翻转。
2、从start位置开始找空格,如果没有找到证明该字符串没有空格,则跳出循环直接翻转。
3、找到一个翻转一个,并且将start的值置为end+1,下次再从start的位置开始找空格。
文章来源:https://blog.csdn.net/m0_69260381/article/details/134793744
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!