打卡六十天:第八天 第四章 字符串part01

● 344.反转字符串

class Solution {
public:
    void reverseString(vector<char>& s) {
        int l =s.size();
        int i=0,j=l-1;
        for(;i<=j;)
        {
            int m;
            m=s[i];
            s[i]=s[j];
            s[j]=m;
            i++;j--;

        }
    }
};

我这个写的很麻烦,正常用swap(left[i],right[j])
就直接换位了。

● 541. 反转字符串II

思路就是套用了很复杂的循环,然后循环不出去了
【错误】

class Solution {
public:
    string reverseStr(string s, int k) {
        int l= s.size();
        int i=1,j=l-1;
        int m,n=2*k+1;
        for(m=0;;m++)
        {
            if(m==2*k)
            {
                for(;i<=k;)
                { 
                swap(s[i],s[m]);
                i++;
                m--;
                }               
            }
            if(j-n+1<k)
            {
                 for(;n<=j;)
                { 
                swap(s[n],s[j]);
                n++;
                j--;}
            }
            else if((j-n+1<2*k)&&(j-n+1>=k))
            {
                int p=j-n+1;j=p+k;
                 for(;p<=j;)
                { 
                swap(s[p],s[j]);
                p++;
                j--;}
            }
        }
    }
};
class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.length();
        for (int i = 0; i < n; i += 2 * k) {
            reverse(s.begin() + i, s.begin() + min(i + k, n));
        }
        return s;
    }
};

reverse(s.begin() + i, s.begin() + min(i + k, n));这是一个将字符串 s 中从索引 i 开始的连续 k 个字符进行反转的函数调用。它使用了 C++ 的 reverse 函数,将字符串中的指定范围进行反转。s.begin() + i 表示从索引 i 开始的迭代器,s.begin() + min(i + k, n) 表示从索引 i 加上 k 和字符串长度 n 中的较小值的迭代器。这个函数调用会将该范围内的字符顺序反转。
reverse是反转,swap是交换位置。
for (int i = 0; i < n; i += 2 * k) {
reverse(s.begin() + i, s.begin() + min(i + k, n));
}
min(i + 2, n)这个是怕不断的加倍之后超出字符串长度

当k=2时, for (int i = 0; i < n; i =i+4) {
reverse(s.begin() + i, s.begin() + min(i + 2, n));
}
比如这个字符串是abcd,
s.begin() + i=a,
s.begin() + min(i + 2, n)=c,
那换的不是把abcd变成cbad吗?
这样做为啥还能判断剩余字符啊?
它就没判断什么剩不剩余字符 ,它直接把一个字符串分很多段,还是不懂。。。

● 剑指Offer 05.替换空格

因为数组只能覆盖,所以1换多要多郑一个数组,建立一个新数组s,使用函数s.push_back(’ ')就可以把字符加到里面了。

● 151.翻转字符串里的单词

问题是,倒着输出如何能保证单词的顺序是正确的。
s = “the sky is blue”

class Solution {
public:
    string reverseWords(string s) {
        // 反转整个字符串
        reverse(s.begin(), s.end());//eulb si yks eht这一步是让blue这个单词到最前面

        int n = s.size();
        int idx = 0;
        for (int start = 0; start < n; ++start) {
            if (s[start] != ' ') {
                // 填一个空白字符然后将idx移动到下一个单词的开头位置
                if (idx != 0) s[idx++] = ' ';

                // 循环遍历至单词的末尾
                int end = start;
                while (end < n && s[end] != ' ') s[idx++] = s[end++];

                // 反转整个单词
                reverse(s.begin() + idx - (end - start), s.begin() + idx);

                // 更新start,去找下一个单词
                start = end;
            }
        }
        s.erase(s.begin() + idx, s.end());
        return s;
    }
};

【自己写滴】

class Solution {
public:
    string reverseWords(string s) {
        string a,b;
        int i=0;
        int l=s.size();//15
        reverse(s.begin(),s.end());//eulb si yks eht
      for(;i<l;)
        {
            if(s[i]==' ')//
            {
                reverse(a.begin(),a.end());//blue
                b=b+a;          
                i++;
                while(s[i]==' ')
                {i++;}
                a="";
                if(i<l)
                if(b!="")//判断空格是不是在第一个字符上,如果在第一个字符上,忽略
                {b.push_back(' ');}
                
            }
            else
            {
                a.push_back(s[i]);
                i++;
            }    
            if(i==l)//因为最后一个单词没有空格,所以需要直接加
            {
            reverse(a.begin(),a.end());
            b=b+a;
            }       
        }
        return b;
    }
};

● 剑指Offer58-II.左旋转字符串(最后一道加油!)

一遍过,很简单。我想到的就是切片,把一个字符串分成两个字符串,然后交换顺序。
另一种方式是用一个字符串先遍历后边的部分,再遍历前面的部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值