列表

详情


HJ45. 名字的漂亮度

描述

给出一个字符串,该字符串仅由小写字母组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。

给出多个字符串,计算每个字符串最大可能的“漂亮度”。

本题含有多组数据。

数据范围:输入的名字长度满足


输入描述

第一行一个整数N,接下来N行每行一个字符串

输出描述

每个字符串可能的最大漂亮程度

示例1

输入:

2
zhangsan
lisi

输出:

192
101

说明:

对于样例lisi,让i的漂亮度为26,l的漂亮度为25,s的漂亮度为24,lisi的漂亮度为25+26+24+26=101.

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 324KB, 提交时间: 2020-12-16

#include <stdio.h>
//#include <ctype.h>

int main()
{
    int N;//整数N,后续N个名字
    char str[100000];
    int length;
    int temp;
    int sum;
    while(scanf("%d\n",&N)!=EOF)
    {
        for(int n=1;n<=N;n++)
        {
            scanf("%s\n",&str);
            length=strlen(str);
            sum=0;
            
            //统计每个字符的数量  初始化为0
            int arr[26]={0};
            //检测字符是什么
            for(int i=0;i<length;i++)
            {
                str[i]=toupper(str[i]);
                arr[str[i]-'A']++;
            }
            
            for(int i=0;i<26-1;i++)
            {
                for(int j=0;j<26-1-i;j++)
                {
                    if(arr[j]<arr[j+1]) //从大到小排列
                    {
                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                    }
                }
            }
            for(int i=0;i<26;i++)
            {
                sum=sum+(arr[i]*(26-i));
//                 if(arr[i]==0)
//                     break;
            }
            printf("%d\n",sum);
        }
    }
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 344KB, 提交时间: 2021-09-07

#include <stdio.h>
#include <string.h>
int main(){
    int n;
    while(scanf("%d", &n) != EOF){
        for(int i = 0; i < n; i++){
            char s[10000] = {0};
            scanf("%s", s);
            int len = strlen(s);
            int a[26] = {0};
            int sum = 0;
            int tmp = 0;
            for(int j = 0; j < len; j++){
                if(s[j] >= 'a' && s[j] <= 'z')
                    a[s[j] - 'a'] ++;
                else if(s[j] >= 'A' && s[j] <= 'Z')
                    a[s[j] - 'A'] ++;
            }
            for(int j = 0; j < 26; j++){
                for(int k = 0; k < 25 - j; k++){
                    if(a[k] > a[k+1]){
                        tmp = a[k];
                        a[k] = a[k+1];
                        a[k+1] = tmp;
                    }
                }
            }
            for(int j = 25; j >= 0; j--){
                sum = sum + a[j] * (j+1);
            }
            printf("%d\n", sum);
        }
    }
    return 0;
}

上一题