首页 > 编程语言 >[7]-代码随想录算法训练营-day8-字符串-part1

[7]-代码随想录算法训练营-day8-字符串-part1

时间:2023-09-17 14:13:57浏览次数:38  
标签:string day8 int 随想录 fast part1 字符串 size

代码随想录算法训练营第八天|数组字符串-part1

1.Leecode 344. 反转字符串

  1. 题目

  2. 思路

  3. 刷随想录后想法

    • 双指针,用swap
  4. 实现困难

  5. 实现代码

    class Solution {
    public:
        void reverseString(vector<char>& s) {
            int right = s.size() - 1;
            int left = 0;
            for (left = 0; left < s.size() / 2; left++){
                swap(s[left], s[right]);
                right--;
            }
        }
    };
    
  6. 学习收获

2.Leecode 541. 反转字符串 II

  1. 题目

  2. 思路

    • 借鉴344反转字符串
  3. 刷随想录后想法

    • 步长2k
    • 借用判定条件判断
  4. 实现困难

    • 过程理解不难,代码
  5. 实现代码

    class Solution {
    public:
        string reverseStr(string s, int k) {
            for (int i = 0; i < s.size(); i += (2 * k)){
                //2k步长
                if (i + k <= s.size()){
                    //剩余的字符大于等于k个
                    reverse(s.begin() + i, s.begin() + i + k);
                }else {
                    //剩下的字符不足k个
                    reverse(s.begin() + i, s.end());
                }
            }
            return s;
        }
    };
    
  6. 学习收获

    • 边界值条件判定分析

3.Leecode 05. 替换空格

  1. 题目

  2. 思路

    • 遍历,替换
  3. 刷随想录后想法

    • 统计空格,拓展原字符串空间,节省空间同时节省时间复杂度
  4. 实现困难

    • 发现题读错了。。。
  5. 实现代码

    class Solution {
    public:
        string replaceSpace(string s) {
            int count = 0 ;
            int oldSize = s.size();
            for (int i = 0; i < s.size(); i++){
                if(s[i] == ' '){
                    count++;
                }
            }
    
            //扩展s空间
            s.resize(s.size() + 2 * count);
            int newSize = s.size();
    
            for (int i = oldSize - 1, j = newSize -1; i < j; i--){
                if ( s[i] != ' '){
                    s[j] = s[i];
                    j--;
                }else{
                    s[j] = '0';
                    s[j - 1] = '2';
                    s[j-2] = '%';
                    j = j - 3;
                }
            }
            return s;
        }
    };
    
  6. 学习收获

    • 关于c++拓展字符串空间的方法
    • 双指针关于插入字符的方法

4.Leecode 151. 反转字符串中的单词

  1. 题目

  2. 思路

    • 双指针,从尾部开始取出s的单词,存放到t字符串中
  3. 刷随想录后想法

    • 先整体翻转字符串
    • 再翻转每个单词内部字符串的字符
  4. 实现困难

    • 多余空格处理
    • 空间复杂度为O(1)
    • 边界条件处理
  5. 实现代码

    class Solution {
    public:
        string deleteSpase(string s){
            //删除多余的空格
            int size = s.size();
            int slow =0;
            int fast = 0;
            for ( ; fast < size; fast++){
                if( s[fast] != ' '){
                    if (slow != 0){
                        //如果不是首字母,需要加一个空格
                        s[slow] = ' ';
                        slow++;
                    }
                    //移动字符串
                    while(s[fast] != ' ' && fast < size){
                        s[slow] = s[fast];
                        slow++;
                        fast++;
                    }
                }
            }
            //需要删除多余的空间,否则会溢出
            s.resize(slow);
            return s;
        }
    
        void revString(string &str, int start, int end){
            //翻转传入的字符串
    
            for (; start < end; start++, end--){
                swap(str[start], str[end]);
            }
        }
    
        string reverseWords(string s) {
            s = deleteSpase(s);
    
            revString(s, 0, s.size()-1);
            //翻转每一个单词
            for (int fast = 0, slow = 0; fast <= s.size(); fast++){
                //slow移动规则,不仅仅只有空格,还要考虑尾部的情况
                if (s[fast] == ' ' || fast == s.size()){
                    revString(s, slow, fast - 1);
                    slow = ++fast;
                }
            }
            return s;
        }  
    };
    
  6. 学习收获

    • 使用O(1)的空间思考问题
    • 两次反转字符串得到正序
    • 双指针的应用拓展
    • 同时发现本人代码相比卡哥代码在时间和内存上任然存在差距

5.Leecode 剑指 Offer 58 - II. 左旋转字符串

  1. 题目

  2. 思路

    • for循环一个一个翻转
  3. 刷随想录后想法

    • 先翻转前n个
    • 然后翻转剩余的
    • 最后整体翻转
  4. 实现困难

  5. 实现代码

    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;
        }
    };
    
  6. 学习收获

    • get一种新的解题方法

标签:string,day8,int,随想录,fast,part1,字符串,size
From: https://www.cnblogs.com/Miubai-blog/p/17708695.html

相关文章

  • 代码随想录算法训练营-回溯算法-2|55. 跳跃游戏、45. 跳跃游戏 II、1005. K 次取反后
    55. 跳跃游戏1.跳跃的覆盖范围。这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!2. 贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。时间复杂度:O(n)空间复杂度:O(1)1classSolution:2defca......
  • vue--day88--缓存路由组件和 两个新的生命周期钩子
    ###10.缓存路由组件 1.作用:让不展示的路由组件保持挂载,不被销毁。 2.具体编码:   ```vue  <keep-aliveinclude="News">     <router-view></router-view>  </keep-alive>  ``` ###11.两个新的生命周期钩子 1.作用:路由组件所独有的两......
  • vue--day86--编程式路由导航
    1.作用:不借助```<router-link>```实现路由跳转,让路由跳转更加灵活 2.具体编码:   ```js  //$router的两个API  this.$router.push({  name:'xiangqing',  params:{  id:xxx,  title:xxx  }  })    this.$router.re......
  • vue--day85--<router-link>```的replace属性
    1.作用:控制路由跳转时操作浏览器历史记录的模式2.浏览器的历史记录有两种写入方式:分别为```push```和```replace```,```push```是追加历史记录,```replace```是替换当前记录。路由跳转时候默认为```push```3.如何开启```replace```模式:```<router-linkreplace.......>News</r......
  • 代码随想录算法训练营第十天
    代码随想录算法训练营第十天|LeetCode20(有效的括号)LeetCode1047(删除字符串中的所有相邻重复项)LeetCode150(逆波兰表达式求值)20:有效的括号LeetCode20(有效的括号)方法一importjava.util.Stack;classSolution{publicbooleanisValid(Strings){......
  • vue--day84---路由的props配置
    ###7.路由的props配置 ​作用:让路由组件更方便的收到参数 ```js{name:'xiangqing',path:'detail/:id',component:Detail, //第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件//props:{a:900} //第二种写法:props值......
  • 代码随想录算法训练营-回溯算法|455. 分发饼干、376. 摆动序列
    1.贪心算法一般分为如下四步:将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 455. 分发饼干1.局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。时间复杂度:O(nlogn)空间......
  • [代码随想录]Day46-动态规划part14
    题目:1143.最长公共子序列思路:主要就是两大情况:text1[i-1]与text2[j-1]相同,text1[i-1]与text2[j-1]不相同如果text1[i-1]与text2[j-1]相同,那么找到了一个公共元素,所以dp[i][j]=dp[i-1][j-1]+1;如果text1[i-1]与text2[j-1]不相同,那就看看......
  • 代码随想录算法训练营第九天
    代码随想录算法训练营第九天|LeetCode232(用栈实现队列)LeetCode225(用队列实现栈)栈和队列理论基础定义栈(stack),一种遵循先进后出(FILO—First-In/Last-Out)原则的线性存储结构。队列(queue),一种遵循先进先出(FIFO—firstinfirstout)原则的线性存储结构栈方法方法名......
  • 代码随想录算法训练营第10天| 232.用栈实现队列 ● 225. 用队列实现栈
    栈和队列232.用栈实现队列stack:queue:卡哥代码一个入栈,一个出栈,即可模拟队列的pop操作pop之前要检查出栈是否为空若为空,则排出入栈里所有的元素至出栈中classMyQueue{public:stack<int>stackIn;stack<int>stackOut;MyQueue(){......