【华为机试题】名字漂亮度

题目描述
给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。
输入描述:
整数N,后续N个名字

输出描述:
每个名称可能的最大漂亮程度

示例1
输入
2
zhangsan
lisi
输出
192
101


思路:我们可以用一个数组来统计各个字母的出现次数,并且可以巧妙利用倒序来进行乘法运算

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    string str;
    while(cin>>n)
    {
        while(n--)
        {
            cin>>str;
            int sum=0;
            int flag[26]={0};
            for(int i=0;i<str.size();i++)
            {
                if(str[i]<'a')
                    flag[str[i]-'A']++;
                else
                    flag[str[i]-'a']++;
            }
            sort(flag,flag+26);
            for(int i=25;i>=0;i--)
            {
                sum+=flag[i]*(i+1);
            }
            cout<<sum<<endl;
        }
    }
        return 0;
}

还有一种方法是利用map容器,对map进行数据插入,如果检测到已有,则将对应的value值+1,
因为map容器是非线性的,sort函数不能对非线性的容器进行排序,因此我们可以将map容器放入vector中,间接利用vector来排序。

#include <bits/stdc++.h>
using namespace std;
bool cmp(pair<char,int> a,pair<char,int> b)
{
    return a.second > b.second;
}
int main()
{
    int n;
    string str;
    while(cin>>n)
    {
        while(n--)
        {
            cin>>str;
            map<char,int>mp;
            int cnt=0,m=26;
            for(int i=0;i<str.size();i++)
            {
                str[i]=toupper(str[i]);
            }
            for(int i=0;i<str.size();i++)
            {
                if(mp.count(str[i])==0)
                    mp.insert(make_pair(str[i],1));
                else
                    mp[str[i]]++;
            }
            vector<pair<char,int>> nv(mp.begin(),mp.end());
            sort(nv.begin(),nv.end(),cmp);
            for(int i=0;i<nv.size();i++)
            {
                cnt+=(nv[i].second*m);
                m--;
            }
            cout<<cnt<<endl;
        }
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/u011544909/article/details/79946749