翻转字符串
来源:互联网 发布:网络订购白兰地 编辑:程序博客网 时间:2024/06/07 10:21
描述:给定一个字符串,逐个翻转字符串中的每个单词。
说明
单词的构成:无空格字母构成一个单词
输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
样例:
Given s = “the sky is blue”,
return “blue is sky the”.
思路:先反转整个字符串,然后再反转字串。譬如先将“I am a student”反转为“tneduts a ma I”,然后再对每个字串(空格分割)反转一次。
新知识点:string t(s)//新建一个字符串t与已存在的s结构、参数完全一致;
p.find_first_not_of(” “)//返回字符串p第一个不是空格的字符的序号
p.find_last_not_of(” “)//返回字符串p最后一个不是空格的字符的序号
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)
class Solution {public: /** * @param s : A string * @return : A string */ string reverseWords(string s) { // write your code here int len=s.size(),i,cnt=0,k=0,pos=0,cd; /*创建两个字符串:t用来存放整体翻转后的字符串;p用来存放每个单词都翻转后的字符串*/ string t(s); string p(s); /*翻转整个字符串*/ for(i=0; i<len; i++){ t[i]=s[len-1-i]; } /*翻转每个单词*/ for(i=0; i<len; i++) { /*依次翻转除最后一个单词之外的所有单词*/ if(t[i] == ' ')//每次检测到空格,表示一个完整的单词 { cd=i-pos;//计算待翻转的单词的长度,存入cd /*翻转单词*/ for(k=0; k<cd; k++) p[cnt++]=t[i-k-1]; pos=i+1;//pos记下翻转后的单词的结尾的序号,之所以加1,是因为cd=i-pos中的i是每次检测到新单词的最后的空格的序号,而pos=i+1中的i是前一个单词的空格的序号,所以为了计算下一个待翻转的单词(即新单词)的长度,pos也得加1,使pos存放的是新单词第一个字符的序号。 p[cnt++]=' ';//翻转完毕后,将单词后面一个字符置为空格 } /*翻转最后一个单词*/ if( i == (len-1))//因为最后一个单词后面没有空格,只有通过判断计数是否到达了(长度-1),若到达了,则表示最后一个单词完整了 { cd=i-pos+1;//计算最后一个单词的长度,之所以加1,因为pos此时存放的是最后一个单词的第一个字符的序号,而此时的i存放的是len-1,即最后一个单词的最后一个字符的序号,i-pos表示的是最后一个单词的长度减1. /*翻转最后一个单词*/ for(k=0; k<cd; k++,cnt++) p[cnt]=t[i-k]; } } /*去掉字符串前后多余的空格*/ p.erase(0,p.find_first_not_of(" ")); p.erase(p.find_last_not_of(" ") + 1); return p; }};
以上是自己编写的结果 ,后面参考网上,找到更优的解决算法。
思路:每个单词逐次翻转并同时存入新的字符串中。先将单词存入temp中,此时单词已经翻转,然后将temp中的字符串再进行翻转,恢复原状并写入新字符串ss中。
新知识点:s.length()//表示字符串s的长度
ss.push_back(’ ‘)//表示在字符串ss后加上一个字符,此处为空格
ss.append(temp)//表示在字符串ss后加上一个字符串,此处为字符串temp
string reverseWords(string s) { // write your code here string ss; int i = s.length()-1;//此时i表示的字符串最后一个字符所在的序号 while(i>=0) { while(i>=0&&s[i] == ' ')//解决了首末字符为空格的情况,另外也去掉了两个单词之间的空格 { i --; } if(i<0) break;//所有单词翻转结束,退出循环 if(ss.length()!=0)//当翻转一个单词结束后,在后面加上一个空格 ss.push_back(' '); string temp ;// for(;i>=0&&s[i]!=' ';i--)//将单词暂存至temp,此时单词是翻转后的状态 temp.push_back(s[i]); reverse(temp.begin(),temp.end());//进行单词翻转,恢复原状 ss.append(temp);//将翻转后的单词存入字符串ss中 } s=ss; return s; }
- 翻转字符串
- 翻转字符串
- 字符串翻转
- 字符串翻转
- 翻转字符串
- 翻转字符串
- 字符串翻转
- 翻转字符串
- 翻转字符串
- 字符串翻转
- 翻转字符串
- 字符串翻转
- 翻转字符串
- 字符串翻转
- 翻转字符串
- 字符串翻转
- 字符串翻转
- 字符串翻转
- 记录DEBUG汇编指令
- HashTable和HashMap的区别详解
- java中json数据的转化
- ibdata1共享表空间文件都包含什么内容
- 谈谈PBOC3.0中使用的国密SM2算法
- 翻转字符串
- 判断一整数是否为2的阶次方数,找出最优的方法
- Android-scrollview里的textview无法撑满屏幕解决方案
- Java项目单点登录
- utf8与unicode转换
- 多表查询(三)
- idea 断电后异常问题处理
- Win10应用未在所需的时间内启动该怎么办?win10自带应用打不开的解决方法
- 单片机开发之按键