1. 程式人生 > >【華為機試題】名字漂亮度

【華為機試題】名字漂亮度

題目描述
給出一個名字,該名字有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;
}