字符串变形拷贝c语言,字符串的变形 - ranjiewen的个人空间 - OSCHINA - 中文开源技术交流社区...

//对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格,//就像"Hello World"一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。//比如"Hello World"变形后就变成了"wORLD hELLO"。//输入描述://给定一个字符串s以及它的长度n(1≤n≤500)//

//输出描述 ://请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。//

//输入例子 ://"This is a sample", 16//

//输出例子 ://"SAMPLE A IS tHIS"//

//这道题看上去不是很难,可是很多边界问题 需要考虑。//比如:##this#is#a#sample## 返回 ##SAMPLE#A#IS#THIS##,而不是SAMPLE#A#IS#THIS。(Tips:#代表空格)//本题的思路:首先将字符串大小写进行替换,然后反转整个字符串,最后反转每个单词,其他的不改变。

#include

using namespacestd;

#include#include#include

classTransform {public:string trans(string s, intn) {//write code here

vectorvec;

stack >sta;for (int i = 0; i < n;i++)

{if ('Z'>=s[i]&&s[i]>='A')

{

s[i]= s[i] + 32;

vec.push_back(s[i]);if (i == (n - 1)) //最后没有结束标志

{

sta.push(vec);

vec.clear();

}

}else if ('a'<=s[i]&&'z'>=s[i])

{

s[i]= s[i] - 32;

vec.push_back(s[i]);if (i==(n-1))

{

sta.push(vec);

vec.clear();

}

}else if (s[i]==' ')

{if (!vec.empty()) //为空格的情况

{

sta.push(vec);

vec.clear();

}

vec.push_back(s[i]);

sta.push(vec);

vec.clear();

}

}stringresult;while (!sta.empty())

{

vector temp=sta.top();for (auto it = temp.begin(); it!= temp.end();it++)

{

result+= *it;

}//result += ' ';

sta.pop();

}returnresult;

}

};intmain()

{

Transform t;stringstr;intn;

getline(cin,str);

cin>>n;//t.trans(str,n);

cout << t.trans(str, n)<

}//可以把反转和大小写变化分开进行。

classTransform {public:string trans(string s, intn) {//write code here//大小写替换

for (int i = 0; i < n; i++){if (s[i] >= 'a'&&s[i] <= 'z'){

s[i]=toupper(s[i]);

}else if (s[i] >= 'A'&&s[i] <= 'z'){

s[i]=tolower(s[i]);

}

}//反转整个字符串

reverse(s.begin(), s.end());

auto pbegin=s.begin();

auto pend=s.begin();while (*pend != '\0'){if (*pend == ' '){//碰到空格则反转单词

reverse(pbegin, pend);

pbegin= pend + 1;

}++pend;

}//处理边界情况,字符串末尾的单词需要反转

reverse(pbegin, pend);returns;

}

};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值