CF290D Orange 题解

· · 题解

原题传送门

题意:

不难看出,后面的遍历不难,难点在于前面的字符串大写转小写。看到大家都是自己写函数实现的,那么,难道我们就没有现成的函数去实现吗?

还真有。

C++ STL 中有一个现成的transform函数可以实现。

transform的用法是transform(first,last,result,op),使用时要引用头文件algorithm。其中first是容器的首迭代器,last是容器的末迭代器,result是存放容器,op为要进行操作的一元函数对象或sturctclass。(其实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@中华丛迅