代码随想录算法训练营第八天| LeetCode344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词剑指 Offer58-II.左旋转字符串

344.反转字符串

题目:344. 反转字符串

class Solution {
public:
    void reverseString(vector<char>& s) {
        int l = 0, r = s.size() - 1;
        while(l < r){
            swap(s[l],s[r]);
            l++;
            r--;
        }
    }
};

541. 反转字符串II

题目:541. 反转字符串 II

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.size();
        int y = 0;
        while(n >= 2* k){
            reverse(s.begin() + y,s.begin() + y + k);
            n = n - 2 * k;
            y += 2 * k ;
        }
        if(n < k) reverse(s.begin() + y, s.end());
        else if(n >= k && n < 2 * k) reverse(s.begin() + y, s.begin() + y + k);

        return s;
    }
};

//更精简的写法
class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.size(),pos = 0;
        while(pos < n){
            //剩余字符串大于等于k的情况
            if(pos + k < n) reverse(s.begin() + pos, s.begin() + pos + k);
            //剩余字符串不足k的情况 
            else reverse(s.begin() + pos,s.end());
            pos += 2 * k;
        }
        return s;
    }
};

剑指Offer 05.替换空格

题目:剑指 Offer 05. 替换空格

class Solution {
public:
    string replaceSpace(string s) {
        string ans = "";
        for(char c : s){
            if(c != ' ') ans += c;
            else{
                ans += "%20";
            }
        }
        return ans;
    }
};
//双指针法 不需要额外的新string
class Solution {
public:
    string replaceSpace(string s) {
        int count = 0;
        int n = s.size();
        for(char c : s){
            if(c == ' ') count++;
        }
        s.resize(n + count * 2);
        int m = s.size();
        for(int i = m - 1,j = n -1;  j >= 0; --i,--j){
            if(s[j] == ' ') {
                s[i] = '0';
                s[i-1] = '2';
                s[i-2] = '%';
                i -= 2;
            }else{
                s[i] = s[j];
            }

        }
        return s;
    }
};

151.翻转字符串里的单词

题目:151. 反转字符串中的单词

class Solution {
public:
    void removeSpaces(string& s){
        //快慢指针删除空格
        int slow = 0;
        for(int i = 0; i < s.size(); ++i){
            if(s[i] != ' ') {
                if(slow != 0) s[slow++] = ' ';
                while(i < s.size() && s[i] != ' '){
                    s[slow++] = s[i++];
                }

            }
        }
        s.resize(slow);
    }
    void reverse(string& s,int start,int e){
        //双指针reverse单词
        int l = start;
        int r = e;
        while(l < r){
            swap(s[l],s[r]);
            l++;
            r--;
        }
    }
    string reverseWords(string s) {
        removeSpaces(s);
        reverse(s,0,s.size()-1);
        int n = 0;
        for(int i = 0; i <= s.size(); ++i){
            if(s[i] == ' ' || i == s.size()){
                reverse(s,n, i - 1);
                n = i + 1;
            }
        }
        return s;
    }
};


    string reverseWords(string s) {
        removeSpaces(s);
        //借助额外空间
        vector<string> v;
        string temp = "";
        for(char c : s){
            if(c != ' ') {
                temp += c;
            }else{
                v.push_back(temp);
                temp = "";
            }
        }
        v.push_back(temp);
        reverse(v.begin(),v.end());
        string ans = "";
        for(int i = 0 ; i < v.size(); ++i){
            ans += v[i];
            if(i != v.size() - 1)
            ans += " ";
        }
        return ans;
    }

剑指Offer58-II.左旋转字符串

题目:剑指 Offer 58 - II. 左旋转字符串

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        string ans = "";
        for(int i = n;i < s.size(); i++){
            ans += s[i];
        }
        for(int i = 0; i < n; i++){
            ans += s[i];
        }
        return ans;
    }
};


//不开辟额外空间
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(),s.begin() + n);
        reverse(s.begin()+n,s.end());
        reverse(s.begin(),s.end());
        return s;
    }
};

总结

题型:字符串中元素的删除(快慢指针,类似于leetcode27),字符串的反转(双指针),反转前K个字节

技巧:想不开辟额外空间进行操作,需要想到双指针的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双针来遍历字符串,一个字符串的开头,另一个字符串的结尾。通过比较两个针所向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这由于数组已经是有序的,所以可以使用双针的方法来解决问题。一个向数组的开头,另一个向数组的末尾。通过比较两个针所向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值