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

可以做数学题的网站/链接地址

可以做数学题的网站,链接地址,保险网站导航,wordpress 茶叶模板文章目录1.问题描述2.解决方案方法一:使用string库函数完成第一步:去重冗余空格操作1.使用string库函数erase()直接移除2.使用双指针第二步:将标准的字符串进行分割第三步:合起来看效果方法二:使用string和char[]互相转…

文章目录

    • 1.问题描述
    • 2.解决方案
      • 方法一:使用string库函数完成
        • 第一步:去重冗余空格操作
          • 1.使用string库函数erase()直接移除
          • 2.使用双指针
        • 第二步:将标准的字符串进行分割
        • 第三步:合起来看效果
      • 方法二:使用string和char[]互相转化加char[]库函数strtok()一步完成


1.问题描述

分割字符串这种操作在java中其实是有API直接调用的,但是在C++中没有,今天就来分析实现一个可以去除冗余空格并且分割字符串的可复用的函数!


2.解决方案


方法一:使用string库函数完成

使用STL进行字符串分割涉及到string类的两个函数find和substr:
1、find函数
原型:size_t find (const string& str, size_t pos = 0) const;
功能:查找子字符串第一次出现的位置。
参数说明:str为子字符串,pos为初始查找位置。
返回值:如果是字串返回第一次出现的位置,如果不是返回string::npos(为-1或者4294967295都算对!!!!!!!!!!)
2、substr函数(左起始,右长度)
原型:string substr (size_t pos = 0, size_t n = npos) const;
功能:获得子字符串。
参数说明:pos为起始位置(默认为0),n为要截取字符串的长度
返回值:一个子字符串,从其指定的位置开始
备注:如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾


第一步:去重冗余空格操作

1.使用string库函数erase()直接移除

逻辑很简单就遇见多余空格就移除,但是移除函数最快,自己实现用双指针也得o(n)27. 移除元素,那么整体代码就是o(n^2)了很慢

void removeExtraSpaces_low(string& s) {//1.删除中间的空格for(int i=s.size()-1;i>0;i--) {if (s[i]==s[i - 1]&&s[i]==' ') {s.erase(s.begin() + i);}}//2.删除字符串最后面的空格if (s.size() > 0 && s[s.size() - 1] == ' ') {s.erase(s.begin() + s.size() - 1);}//3.删除字符串最前面的空格if (s.size() > 0 && s[0] == ' ') {s.erase(s.begin());}
}
2.使用双指针

1.使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。
2.fastIndex走的快,slowIndex走的慢,最后slowIndex就标记着移除多余空格后新字符串的长度。
3.其实就是一个字符串有很多没用的字符,fastIndex在前面进行筛选正确的字符就赋给slowIndex,错误的fastIndex就直接略过,所以最后slowIndex走过的就是真正的目标字符串!

//移除冗余空格:使用双指针(快慢指针法) O(n)的算法
//去掉冗余空格 " This is  a  sentence with 7 tokens  " --变为-->"This is a sentence with 7 tokens"
void removeExtraSpaces(string& s) {//1.定义快指针,慢指针int slowIndex=0, fastIndex=0;//2.去掉字符串前面的空格while (s.size() > 0 && fastIndex<s.size()&&s[fastIndex]==' '){fastIndex++;}//3.去掉字符串中间部分的冗余空格for (;fastIndex<s.size();fastIndex++) {//最妙的地方!!!!!!!//遇到中间多余的空格(从第二个空格开始算多余的),直接略过,如果是第一个空格或者字母直接赋值给慢指针if (fastIndex-1>0 && s[fastIndex-1]==s[fastIndex] && s[fastIndex]==' '){continue;}else{s[slowIndex++]=s[fastIndex];}}//4.去掉字符串末尾的空格,因为如果字符串原本最后有很多空格,第一个空格是会被记录到slowIndex中的,所以要清楚一下if(slowIndex-1> 0 && s[slowIndex-1]==' ') {s.resize(slowIndex - 1);} else {s.resize(slowIndex); // 重新设置字符串大小}
}


第二步:将标准的字符串进行分割

//"This is a sentence with 7 tokens"
//input		输入的字符串
//c			分割符
//segment	输出分割字符片段(集)
bool strSegmentation(string input,char c,vector<string>& segment){if(input.size()==0) return false;while(1){int index=input.find(c);if(index==-1){segment.push_back(input);break;} else{string str=input.substr(0,index);input.erase(0,index+1);segment.push_back(str);}}if(segment.size() == 0) return false;else return true;
}


第三步:合起来看效果

#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <unordered_set>
#include <unordered_map>
using namespace std;void removeExtraSpaces_low(string& s) {//1.删除中间的空格for(int i=s.size()-1;i>0;i--) {if (s[i]==s[i - 1]&&s[i]==' ') {s.erase(s.begin() + i);}}//2.删除字符串最后面的空格if (s.size() > 0 && s[s.size() - 1] == ' ') {s.erase(s.begin() + s.size() - 1);}//3.删除字符串最前面的空格if (s.size() > 0 && s[0] == ' ') {s.erase(s.begin());}
}//移除冗余空格:使用双指针(快慢指针法) O(n)的算法
//去掉冗余空格 " This is  a  sentence with 7 tokens  " --变为-->"This is a sentence with 7 tokens"
void removeExtraSpaces(string& s) {//1.定义快指针,慢指针int slowIndex=0, fastIndex=0;//2.去掉字符串前面的空格while (s.size() > 0 && fastIndex<s.size()&&s[fastIndex]==' '){fastIndex++;}//3.去掉字符串中间部分的冗余空格for (;fastIndex<s.size();fastIndex++) {//最妙的地方!!!!!!!//遇到中间多余的空格(从第二个空格开始算多余的),直接略过,如果是第一个空格或者字母直接赋值给慢指针if (fastIndex-1>0 && s[fastIndex-1]==s[fastIndex] && s[fastIndex]==' '){continue;}else{s[slowIndex++]=s[fastIndex];}}//4.去掉字符串末尾的空格,因为如果字符串原本最后有很多空格,第一个空格是会被记录到slowIndex中的,所以要清楚一下if(slowIndex-1> 0 && s[slowIndex-1]==' ') {s.resize(slowIndex - 1);} else {s.resize(slowIndex); // 重新设置字符串大小}
}//input		输入的字符串
//c			分割符
//segment	输出分割字符片段(集)
bool strSegmentation(string input,char c,vector<string>& segment){if(input.size()==0) return false;while(1){int index=input.find(c);if(index==-1){segment.push_back(input);break;} else{string str=input.substr(0,index);input.erase(0,index+1);segment.push_back(str);}}if(segment.size() == 0) return false;else return true;
}int main(){string str = "    This is     a    sentence with 7 tokens";//1.去除冗余空格removeExtraSpaces(str);cout<<str<<endl;//2.分割字符串vector<string> segment;if(!strSegmentation(str, ' ' ,segment)) return 0;for (auto item: segment) {cout<<item<<endl;}return 0;
}/*
输出结果
This is a sentence with 7 tokens
This
is
a
sentence
with
7
tokens
*/





方法二:使用string和char[]互相转化加char[]库函数strtok()一步完成

strtok()用法总结

思路很简单,先把string转化为char,然后就是在strtok()分割过程中产生的char*直接赋值给string,然后收集就好,这个做法去重冗余空格加分割字符串一步到位,非常的nice!!

#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <cstring>
using namespace std;int main() {//1.准备要分割的字符串和vector<string> ans;string str="      This    is  a sentence with  7 tokens      ";char* sentence=(char *)str.data();//2.开始分割char* tokenPtr=strtok(sentence," ");while(tokenPtr!=NULL) {//关键点:char*直接转化为string并放入vector中ans.push_back(tokenPtr);tokenPtr = strtok(NULL, " ");}//3.输出验证for (auto item: ans) {cout<<item<<endl;}return 0;
}

在这里插入图片描述

http://www.jmfq.cn/news/4962151.html

相关文章:

  • 怎么把自己的网站放到百度上/营销策略有哪些理论
  • 移动互联网开发技术是什么/站长工具seo综合查询引流
  • 公司网站登陆后台管理中心不能修改前台主页/百度seo查询
  • 西安网站推广公司电话/百度统计流量研究院
  • 做商城网站要什么证件/seo排名优化软件有用吗
  • 教育行业网站制作/重庆网站到首页排名
  • 以绿色为主的网站/上海何鹏seo
  • 网站建设怎么管理业务员/网站结构优化的内容和方法
  • 企业网站管理系统免费/优化推广公司哪家好
  • 辽宁省建设安全监督网网站/seo网站推广如何做
  • 南京专业网站营销/北京网站优化外包
  • 大连鼎信网站建设公司/网站建设需要多少钱
  • 全国做网站的/简述seo的基本步骤
  • 最好的科技资讯网站/企业网站推广渠道有哪些
  • 淄博哪个网站做房屋出赁好/精准防控高效处置
  • 网站备案密码使用/搜索引擎营销分析
  • 租办公室/重庆seo技术教程博客
  • 怎么在南京人社网站做失业登记/南宁 百度网盘
  • 上海 网站建设/哪里做网络推广好
  • 网站首页设置伪静态/网络营销的成功案例有哪些
  • 网站建设 有限公司/自动外链发布工具
  • 杭州的电商网站建设/恢复正常百度
  • go做网站/怎么做产品推广和宣传
  • 网站的互动功能/360手机助手
  • 网站设计与网页制作招聘/长沙网站seo源头厂家
  • 自己做网站的难度/网络营销策划书包括哪些内容
  • wordpress站内计费搜索/百度关键词价格
  • 客服24小时在线服务/我赢seo
  • 潍坊做网站建设的公司/百度账户登录
  • 做编程的 网站/磁力搜索引擎哪个好