CF290D Orange 题解
原题传送门
题意:
-
给定一个字符串
s 和一个整数x ,须对s 进行以下操作: -
将
s 的每个字符转换为小写,并 遍历s 的每一个字符,若该字符的字母表序小于等于x 所代表的字母的字母表序,则将其转换为大写,后输出操作后的s 。 -
数据范围:
1\leqslant s \leqslant 50 ,0\leqslant x \leqslant 26 。
不难看出,后面的遍历不难,难点在于前面的字符串大写转小写。看到大家都是自己写函数实现的,那么,难道我们就没有现成的函数去实现吗?
还真有。
C++ STL 中有一个现成的transform函数可以实现。
transform的用法是transform(first,last,result,op),使用时要引用头文件algorithm。其中first是容器的首迭代器,last是容器的末迭代器,result是存放容器,op为要进行操作的一元函数对象或sturct、class。(其实transform还有其它使用方法,这里就不展开讲了。)
对于op,我们可以使用::tolower。
::tolower是处理字符串的函数,可以将大写转换成小写,对于非字母字符不做出处理。将transform和::tolower结合起来,我们就可以把一个字符串从大写转成小写了。(其实::tolower是处理字符的,而不是处理字符串的。所谓的不能处理字符串不是说它不能处理字符串,它处理的时候对字符串必须是一个一个字符处理的,不能一次性对字符串进行处理,但正好可以用在transform上。)
如果还有不明白的地方,可以结合代码看一看。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string s;//要进行转换的字符串
int x;//如果小于等于这个数所代表的字母的字母表序,则需要从小写转为大写
char c;//即上面的数x所代表的字母。
int main(){
cin>>s>>x;
c=x+'a'-1;
transform(s.begin(),s.end(),s.begin(),::tolower);//由于题目不要求储存原输入字符串,我们可以直接将转换后的字符串存回原来的位置
for(int i=0;i<s.size();++i){
if(s[i]>='a'&&s[i]<='z'&&s[i]<=c){
s[i]=s[i]-'a'+'A';
}
}//遍历,不多说
cout<<s;
return 0;
}
注:以上题解参考了两篇文章。
transform部分:
C++学习transform函数的应用 by @浩世轩宇
::tolower部分:
C++tolower函数用法总结 by@中华丛迅