紫书—关于例题5-4反片语的思考

  题目链接:https://vjudge.net/problem/UVA-156

  主要思想:对每个单词进行标准化,标准化:先将每个单词存下来,然后对单词进行排序,排完序后与原来字符串一起存入到map中,之后在开另一个map来记录出现次数.遍历map时只有出现次数为1的才可以被打印出    来.

  AC代码展示:

#include<bits/stdc++.h>
using namespace std;
map<string,string>k;  //存放对应关系的映射
map<string,int>p;  //记录单词出现次数的数组
vector<string>que;  //排序的动态数组
string s;
int main(){
    while(cin>>s,s!="#"){
        string l=s;
        for(int i=0;i<s.length();i++){   //大写转成小写
            s[i]=tolower(s[i]);
        }
        sort(s.begin(),s.end());  //排序
        p[s]++;
        k[s]=l;
    }
    for(auto i=k.begin();i!=k.end();i++){   //  map有排序,但是是按照key来排序的.
        if(p[i->first]==1){
            que.push_back(i->second);
        }
    }
    sort(que.begin(),que.end());
    for(int i=0;i<que.size();i++){
        cout<<que[i]<<endl;
    }
}

  注意事项: map和set都有排序的,但map是按照key来排序的,但答案想让我们用value来排序,故要新建一个动态数组来存放数据进行排序. 

  错误代码展示:   note——当时也是脑子秀逗了,居然好久没看出这个代码有问题.........别再犯这种低级错误啦       {=.=}

#include<bits/stdc++.h>
using namespace std;
map<string,string>k;
string s;
int main(){
    while(cin>>s,s!="#"){
        string l=s;
        for(int i=0;i<s.length();i++){
            s[i]=tolower(s[i]);
        }
        sort(s.begin(),s.end());
        if(!k.count(s)){   //这种方法迷惑性大  是逻辑有问题  因为你不确定先输入的这个后面是否会再次输入  如果再次输入了则这个就废了
            cout<<s<<endl;
            k[s]=l;
        }
    }
    for(auto i=k.begin();i!=k.end();i++){
        cout<<i->second<<endl;
    }
}
posted @ 2021-05-10 10:51  江间暮云  阅读(43)  评论(0)    收藏  举报