【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. OJ题目分享2

    2023-12-06 23:34:04       30 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-06 23:34:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-06 23:34:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-06 23:34:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-06 23:34:04       18 阅读

热门阅读

  1. git小白初学习

    2023-12-06 23:34:04       29 阅读
  2. 让 OpenAI GPT4 出 10 道题测试其他开源大语言模型

    2023-12-06 23:34:04       23 阅读
  3. 什么是DDI?DDI的原理和作用是什么?一文看懂

    2023-12-06 23:34:04       35 阅读
  4. USTC Fall2023 高级人工智能期末考试回忆版

    2023-12-06 23:34:04       38 阅读
  5. 力扣labuladong一刷day29天二叉树

    2023-12-06 23:34:04       39 阅读
  6. 还记得当初自己为什么选择计算机?

    2023-12-06 23:34:04       32 阅读
  7. Spring第四课,MVC终章,应用分层的好处,总结

    2023-12-06 23:34:04       32 阅读
  8. 【分布式学习】之架构、系统、集群部署

    2023-12-06 23:34:04       38 阅读
  9. Prompt Toolkit探索:打造交互式CLI应用

    2023-12-06 23:34:04       37 阅读
  10. uniapp链接WebSocket 常用的API

    2023-12-06 23:34:04       43 阅读