【代码随想录第8天】字符串1

344.反转字符串 (简单)

LeetCode题目: 344.反转字符串
代码随想录: 344.反转字符串
题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

秒了

class Solution {
public:
    void reverseString(vector<char>& s) {
        for(int i = 0, j = s.size()-1; i < j; i++, j--){
        	// 可以直接用swap(s[i],s[j]);
            char tmp = s[i];
            s[i] = s[j];
            s[j] = tmp;
        }
    }
};

541. 反转字符串II(简单)

LeetCode题目:541. 反转字符串II
代码随想录:541. 反转字符串II
题目描述:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

i的步长为2k,
剩余字符少于k: size-1-i+1 < k ,则有 i+k > size

public:
    void reverseString(string& s, int start, int end) {
        for(int i = start, j = end; i < j; i++, j--){
        	// 可以直接用swap(s[i],s[j]);
            char tmp = s[i];
            s[i] = s[j];
            s[j] = tmp;
        }
    }
    string reverseStr(string s, int k) {
        for(int i = 0; i < s.size(); i+= 2*k){ // 步长为2k
            if(i+k > s.size()) // 剩余字符 size-1-i+1 < k -> i+k>size
                reverseString(s, i, s.size()-1);
            else    
                reverseString(s, i, i+k-1); // k个字符
        }
        return s;
    }
};

可以直接用reverse

string reverseStr(string s, int k) {
    for(int i = 0; i < s.size(); i+=2*k){
         if(i+k>s.size()) // 剩余字符少于k个
             reverse(s.begin()+i, s.end()); // 索引为i
         else
             reverse(s.begin()+i, s.begin()+i+k);
     }
     return s;
}

剑指Offer 05.替换空格(简单)

LeetCode题目:剑指Offer 05.替换空格
代码随想录:剑指Offer 05.替换空格(https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html)
题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

扩充数组到每个空格替换成"%20"之后的大小。
然后从后向前替换空格

class Solution {
public:
    string replaceSpace(string s) {
        // 先扩容
        int count = 0;
        int i = s.size() -1;
        for(char ch : s)
            if(ch == ' ')
                count++;
        s.resize(s.size() + 2 * count);
        for(int j = s.size() -1; i>=0; i--,j-- ){
            if(s[i] == ' '){
                s[j--] = '0';
                s[j--] = '2';
                s[j] = '%';
            } else{
                s[j] = s[i];
            }
        }
        return s;
    }
};

注:用resize()扩容后,改变字符串长度属性(length): length() 或 size() 成员函数来获取字符串的长度属性,即字符串中实际包含的字符数。
但字符串实际长度不变,扩容部分默认补’\0’,可以通过迭代器遍历字符串来获取非空字符数(不包括 \0)

151.翻转字符串里的单词 (中)

LeetCode题目: 151.翻转字符串里的单词
代码随想录: 151.翻转字符串里的单词
题目描述:
在这里插入图片描述

1.先去掉多余的空格 :
双指针,只保留每个单词之前的一个空格,
注意:第一个单词之前要去掉空格 slow > 0 && s[fast - 1] == ’ ’ (第一个条件放前面,&&判断的特性,写反了会报错)
2.翻转整个字符串
3.以空格为界翻转每个单词:双指针

class Solution {
public:
    void reverse(string & s, int start, int end){
        for(int i=start, j=end; i < j; i++, j--)
            swap(s[i], s[j]);
    }
    // 去多余空格
    void spaceRemove(string & s){
        int slow = 0;
        for(int fast = 0; fast < s.length(); fast++){
            if(s[fast] != ' '){
                if(slow > 0 && s[fast - 1] == ' '){
                    s[slow++] = ' ';
                }
                s[slow++] = s[fast];
            }
        }
        s.resize(slow);
    }
    string reverseWords(string s) {
        spaceRemove(s);
        // 整体翻转
        reverse(s, 0, s.size()-1);
        for(int i=0, j=0; j <= s.size(); j++){
            if(j == s.size() || s[j] == ' '){
                reverse(s, i, j-1);
                i = j + 1;
            }
        }
        return s;
    }
};

剑指Offer58-II.左旋转字符串(简单)

LeetCode题目: 剑指Offer58-II.左旋转字符串
代码随想录: 剑指Offer58-II.左旋转字符串
题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

思路跟上面翻转单词一样,还剩了去掉空格的步骤
先分别把两段字符串翻转,再整体翻转字符串

class Solution {
public:
    void reverse(string &s, int start, int end){
        for(int i = start, j = end; i < j; i++, j--)
            swap(s[i], s[j]);
    }
    string reverseLeftWords(string s, int n) {
        reverse(s, 0, n-1);
        reverse(s, n, s.size()-1);
        reverse(s, 0, s.size()-1);
        return s;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值