C++从零开始的打怪升级之路(day17)

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

今天分享的是关于string的题目,明天开始vector的学习

1.反转字符串中的单词

557. 反转字符串中的单词 III

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序

这题利用string中的find函数来找到空格然后创建一个反转单词的子函数,注意最后一次交换找不到空格,find函数返回的是string::npos

class Solution {
public:
    void reverse(string& s, int left, int right)
    {
        while (left < right)
        {
            swap(s[left],s[right]);
            ++left;
            --right;
        }
    }

    string reverseWords(string s)
    {
        int begin = 0;
        int end = s.size() - 1;
        while (begin < end)
        {
            int right = s.find(' ', begin + 1);
            if (right == string::npos)
            {
                reverse(s, begin, end);
                break;
            }
            reverse(s, begin, right - 1);
            begin = right + 1;
        }

        return s;
    }
};

这是ac代码

2.反转字符串

 541. 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样

 首先创建一个反转字符串的子函数,再到字符串上面利用双指针控制迭代,要注意边缘情况的控制

class Solution {
public:
    void reverse(string& s,int left,int right)
    {
        while(left < right)
        {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;

            ++left;
            --right;
        }
    }

    string reverseStr(string s, int k) 
    {   
        int begin = 0;
        int end = s.size() - 1;
        while(begin < end)
        {
            int r1 = begin + k;
            if(r1 > end)
            {
                reverse(s,begin,end);
                break;
            }
            int r2 = begin + 2 * k;
            reverse(s,begin,r1 - 1);
            begin = r2;
        }

        return s;
    }
};

 

今天的博客就到这里了,后续内容明天分享,最近因为考试周原因不能更新太多内容,等考试周结束了再"快马加鞭"

新手第一次写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!!

你可能感兴趣的:(c++,开发语言)