【C++】String类经典OJ题目分析

字符串相加

链接: 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的位置开始找空格。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mikk-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值