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


    1. 使用erase()函数

    1. void removeExtraSpaces(string& s) {
    2. for (int i = s.size() - 1; i > 0; i--) {
    3. if (s[i] == s[i - 1] && s[i] == ' ') {
    4. s.erase(s.begin() + i);
    5. }
    6. }
    7. // 删除字符串最后面的空格
    8. if (s.size() > 0 && s[s.size() - 1] == ' ') {
    9. s.erase(s.begin() + s.size() - 1);
    10. }
    11. // 删除字符串最前面的空格
    12. if (s.size() > 0 && s[0] == ' ') {
    13. s.erase(s.begin());
    14. }
    15. }

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

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

    1. //版本一
    2. void removeExtraSpaces(string& s) {
    3. int slowIndex = 0, fastIndex = 0; // 定义快指针,慢指针
    4. // 去掉字符串前面的空格
    5. while (s.size() > 0 && fastIndex < s.size() && s[fastIndex] == ' ') {
    6. fastIndex++;
    7. }
    8. for (; fastIndex < s.size(); fastIndex++) {
    9. // 去掉字符串中间部分的冗余空格
    10. if (fastIndex - 1 > 0
    11. && s[fastIndex - 1] == s[fastIndex]
    12. && s[fastIndex] == ' ') {
    13. continue;
    14. } else {
    15. s[slowIndex++] = s[fastIndex];
    16. }
    17. }
    18. if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ') { // 去掉字符串末尾的空格
    19. s.resize(slowIndex - 1);
    20. } else {
    21. s.resize(slowIndex); // 重新设置字符串大小
    22. }
    23. }
    1. void removeExtraSpaces(string& s){
    2. int left=0,right=0;
    3. //去除字符串前空格
    4. while(rightsize()&&s[right]==' ') right++;
    5. while(rightsize()){
    6. if(s[right]==' '&&s[right]==s[right-1]) right++;
    7. else s[left++]=s[right++];
    8. }
    9. if(s[left-1]==' ') s.resize(left-1);
    10. else s.resize(left);
    11. }

    时间复杂度:O(n)

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

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

    时间复杂度:O(n)

  • 相关阅读:
    记录一次内网渗透过程
    语言基础篇16——Python中的函数式编程
    Spring-Cloud-Ribbon-02
    基于springboot的汽车租赁管理系统的设计与实现
    京东商品质量分检测,如何一键检测全店?
    Java基础之《网站跨域问题》
    几个年薪百万的码农下属
    ApiFox 基本使用教程(浅尝辄止,非广)
    springboot基于协同过滤算法的书籍推荐毕业设计源码101555
    移动端开发环境 - Windows
  • 原文地址:https://blog.csdn.net/weixin_53432918/article/details/133361420