当前位置: 首页 > news >正文

leetcode刷题笔记/代码随想录笔记——移除字符串中多余空格

1. 使用erase()函数

void removeExtraSpaces(string& s) {
    for (int i = s.size() - 1; i > 0; i--) {
        if (s[i] == s[i - 1] && s[i] == ' ') {
            s.erase(s.begin() + i);
        }
    }
    // 删除字符串最后面的空格
    if (s.size() > 0 && s[s.size() - 1] == ' ') {
        s.erase(s.begin() + s.size() - 1);
    }
    // 删除字符串最前面的空格
    if (s.size() > 0 && s[0] == ' ') {
        s.erase(s.begin());
    }
}

时间复杂度:O(n^2)

2. 双指针移除空格,resize()字符串大小

//版本一 
void removeExtraSpaces(string& s) {
    int slowIndex = 0, fastIndex = 0; // 定义快指针,慢指针
    // 去掉字符串前面的空格
    while (s.size() > 0 && fastIndex < s.size() && s[fastIndex] == ' ') {
        fastIndex++;
    }
    for (; fastIndex < s.size(); fastIndex++) {
        // 去掉字符串中间部分的冗余空格
        if (fastIndex - 1 > 0
                && s[fastIndex - 1] == s[fastIndex]
                && s[fastIndex] == ' ') {
            continue;
        } else {
            s[slowIndex++] = s[fastIndex];
        }
    }
    if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ') { // 去掉字符串末尾的空格
        s.resize(slowIndex - 1);
    } else {
        s.resize(slowIndex); // 重新设置字符串大小
    }
}
    void removeExtraSpaces(string& s){
        int left=0,right=0;
        //去除字符串前空格
        while(right<s.size()&&s[right]==' ') right++;
        while(right<s.size()){
            if(s[right]==' '&&s[right]==s[right-1]) right++;
            else s[left++]=s[right++]; 
        }
        if(s[left-1]==' ') s.resize(left-1);
        else s.resize(left);
    }

时间复杂度:O(n)

3. 双指针移除空格,resize()字符串大小优化版

// 版本二 
void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。
    int slow = 0;   //整体思想参考https://programmercarl.com/0027.移除元素.html
    for (int i = 0; i < s.size(); ++i) { //
        if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。
            if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
            while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。
                s[slow++] = s[i++];
            }
        }
    }
    s.resize(slow); //slow的大小即为去除多余空格后的大小。
}
    void removeExtraSpaces(string& s){
        int left=0,right=0;
        for(;right<s.size();right++){
        //仅处理s[right]不为空格的情况
            if(s[right]==' ') continue;
            if(left!=0) s[left++]=' ';
            //注意while循环中要限制right<s.size()
            while(right<s.size()&&s[right]!=' '){
                s[left++]=s[right++];
            }
        }
        s.resize(left);
    }

时间复杂度:O(n)

相关文章:

  • 数组07-滑动窗口、HashMap
  • Leetcode.2571 将整数减少到零需要的最少操作数
  • Lnmp架构之mysql数据库实战2
  • 学习windows系统让python脚本在后台运行的方法
  • Java如何解决浮点数计算不精确问题
  • 从零开始之了解电机及其控制(10)空间矢量理论
  • 代理IP与Socks5代理:跨界电商之安全防护与智能数据引擎
  • Leetcode.2522 将字符串分割成值不超过 K 的子字符串
  • 【数据结构--八大排序】之归并排序
  • C++qt Day10
  • 【C++杂货铺】一颗具有搜索功能的二叉树
  • EPICS教程4-- 在Windows上安装EPICS base
  • oracle 乱码(编码为AMERICAN_AMERICA.US7ASCII)问题解决
  • 高云FPGA系列教程(9):cmd-parser串口命令解析器移植
  • QT day3
  • 如何一键提取微信背景图?
  • 【c语言】贪吃蛇
  • 【面试必刷TOP101】寻找峰值 数组中的逆序对
  • ARM/X86工控机在轨道交通交通管理系统的应用(4)
  • 实现注册手机号用户
  • 日本乒乓名将丹羽孝希因赌博被禁赛6个月,曾获奥运男团银牌
  • 长三角主流媒体将走进“来电”宜昌,探寻高质量发展密码
  • 美军一天内对也门发动50余次袭击,胡塞武装称再次击落美军无人机
  • 淄博张店区国资公司挂牌转让所持“假国企”股权,转让底价为1元
  • 谷雨播种正当时,上海黄道婆纪念公园种下“都市棉田”
  • 2025上海半马鸣枪,多个“首次”冲击一城双白金