首页 > 试题广场 >

名字的漂亮度

[编程题]名字的漂亮度
  • 热度指数:142718 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

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

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

本题含有多组数据。

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



输入描述:

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



输出描述:

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

示例1

输入

2
zhangsan
lisi

输出

192
101

说明

对于样例lisi,让i的漂亮度为26,l的漂亮度为25,s的漂亮度为24,lisi的漂亮度为25+26+24+26=101.   
def func(s):
    # 记录每个字母出现的次数
    res_dict = {}
    # 转换成大写,方便判断
    s = s.upper()
    # 每个字母出现一次,则次数加1,默认为0
    for c in s:
        res_dict[c] = res_dict.get(c, 0) + 1
    # 获取所有字母出现的次数
    res_list = list(sorted(res_dict.values(), reverse=True))
    res = 0
    for i, v in enumerate(res_list):
        res += v*(26-i)
    return res


# num = int(input())
# for i in range(num):
#     print(func(input().strip()))

while True:
    try:
        num = int(input())
        for i in range(num):
            print(func(input().strip()))
    except:
        break

编辑于 2021-05-03 17:27:18 回复(0)
def cal(s):
    dic = {}
    for i in s:
        dic[i] = dic.get(i,0)+1
    lst = sorted(dic.items(), key=lambda x:x[1],reverse=True)
    maxvalue = 26
    total = 0
    for i in lst:
        total = total + i[1]*maxvalue
        maxvalue -= 1
    print(total)
while True:
    try:
        n = int(input())
        for i in range(n):
            s = input()
            cal(s)
    except:
        break
发表于 2021-04-21 10:46:47 回复(0)
#暴力解法
def cal(str):
    a = []
    a.append(str.count('a'))
    a.append(str.count('b'))
    a.append(str.count('c'))
    a.append(str.count('d'))
    a.append(str.count('e'))
    a.append(str.count('f'))
    a.append(str.count('g'))
    a.append(str.count('h'))
    a.append(str.count('i'))
    a.append(str.count('j'))
    a.append(str.count('k'))
    a.append(str.count('l'))
    a.append(str.count('m'))
    a.append(str.count('n'))
    a.append(str.count('o'))
    a.append(str.count('p'))
    a.append(str.count('q'))
    a.append(str.count('r'))
    a.append(str.count('s'))
    a.append(str.count('t'))
    a.append(str.count('u'))
    a.append(str.count('v'))
    a.append(str.count('w'))
    a.append(str.count('x'))
    a.append(str.count('y'))
    a.append(str.count('z'))
    a.sort()
    total = 0
    for i in range(26):
        total += a[26-1-i] * (26-i)
    return total
    

while True:
    try:
        N = int(input())
        for i in range(N):
            name = input()
            print(cal(name))
    except:
        break
            
发表于 2021-03-30 12:15:19 回复(0)
def max_calc(name):
    map = {}
    for x in name:
        if x not in map:
            map[x] = 1
        else:
            map[x] += 1
    sorted_map = sorted(map.items(), key=lambda x: x[1], reverse=True)
    max_beauty = 0
    for i in range(len(sorted_map)):
        max_beauty += sorted_map[i][1] * (26 - i)
    print(max_beauty)

while True:
    try:
        a = int(input())
        for i in range(a):
            max_calc(input())
    except EOFError:
        break

编辑于 2021-03-24 13:38:46 回复(0)
注意题目思路
可能最大的,也就是统计字母排序
从26 倒叙,调试了很久

#encoding= utf-8
if __name__ == '__main__':
    while True:
        try:
            n = input()

            while n>0:
                sum = 0
                a={}
                s1 = []
                name = raw_input()
                n=n-1
                s = name.lower()
                for i in s:
                    if i not in s1:
                        s1.append(i)
                        a[i]=1
                    else:
                        a[i] =a[i]+1
        #         print a
                #d.items()返回的是: dict_items([('a', 1), ('c', 3), ('b', 2)])
                b=sorted(a.items(),key=lambda x:x[1],reverse=True)
        #         print b
                num = len(b)
                for i in xrange(num):
        #             print b[i][1]
                    sum+=int(b[i][1])*(26-i)
                print sum
        except:
            break

发表于 2021-03-12 21:37:51 回复(0)
while True:
    try:
        n = int(input())       
        for i in range(n):            
            str = input()
            temp = []
            sum = 0
            a = 26
            for s in set(str):
                temp.append(str.count(s))
            temp.sort(reverse=True)
            for t in temp:
                sum += a*t
                a -= 1
            print(sum)
    except:
        break

发表于 2021-01-13 10:34:40 回复(0)
from collections import Counter
def func(strs):
    strs=Counter(strs)
    # print(strs)
    strs=dict(sorted(strs.items(),key=lambda x:x[1],reverse=True))
    # print(strs)
    res=0
    n=0
    for k,v in strs.items():
        res+=strs[k]*(26-n)
        n+=1
    print(res)
while True:
    try:
        n=int(input().strip())
        for i in range(n):  
            s=input().strip().lower()                         
            func(s)   
    except:break

发表于 2021-01-04 13:12:10 回复(0)
#本题的关键是理解漂亮度是从26开始,根据字符串的字母的出现频率进行分配
while True:
    try:
        num1 = int(input().strip())
        while num1 > 0:
            begin = 26
            num1 -= 1
            d1 = {}
            str1 = input().strip()
            for x in str1:
                d1[x] = d1.get(x, 0) + 1
            l1 = sorted(d1.items(), key=lambda i: i[1], reverse=True)
            n1 = []
            for x in range(len(l1)):
                n1.append(begin)
                begin -= 1
            pl = 0
            for j in range(len(l1)):
                pl += l1[j][1] * n1[j]
            print(pl)
    except:
        break
发表于 2020-12-24 12:32:14 回复(0)
这已经是第二次跑牛客的编译器3组数据只能显示两组答案说我编译错误了,我的pycharm跑的好好的三组数据都能出来,难道是牛客的编译器太太菜了?????
while True:
    try:
        num = int(input())
        name_list = []
        result = []
        for i in range(num):
            name_list.append(input())
        for name in name_list:
            count_list = []
            for s in name:
                if s not in count_list:
                    count_list.append(s)
                    count_list.append(str(name.count(s)))
            # 按倒序排列
            count_list = sorted(count_list, reverse=True)
            # 取只有数字的部分
            length1 = len(count_list) // 2
            length2 = len(count_list)
            count_list = count_list[length1:length2]
            result.append(count_list)

        for i in result:
            sum_k = 0
            k = 26
            len_i = len(i)
            for j in range(len_i):
                sum_k += k * int(i[j])
                k = k - 1
            print(sum_k)
    except:
        break

发表于 2020-11-29 15:31:56 回复(0)
# 2020年11月17日09:22:34
while True:
    try:
        N = int(input())
        for i in range(N):
            beautiful = 0
            name = input().lower()
#           字母去重
            new_name = list(set(name))
#           利用lambda表达式,根据出现次数降序排列字母
            new_name.sort(key=lambda x:name.count(x[0]),reverse=True)
#           计算名称漂亮度
            for j in range(len(new_name)):
                cnt = name.count(new_name[j])
                beautiful += cnt*(26-j)
            print(beautiful)
    except:
        break
        

发表于 2020-11-17 10:56:01 回复(0)
from collections import defaultdict
while True:
    try:
        n = int(input())
        for i in range(n):
            name = input().lower()
            dd = defaultdict(int)
            for i in name:
                dd[i] += 1
            beautiful, k = 0, 26
            for i in sorted(dd.values(), reverse=True):
                beautiful += i * k
                k -= 1
            print(beautiful)
    except:
        break
        

发表于 2020-09-28 18:20:12 回复(0)
while True:
    try:
        n = int(input())
        for i in range(n):
            curname = input()
            dic = {}
            for j in curname:
                if j not in dic.keys():
                    dic[j] = 1
                else:
                    dic[j] += 1
            sum1 = 0
            newdic = sorted(dic.items(), key=lambda dic: dic[1], reverse=True)
            for i in range(len(newdic)):
                sum1 += int(newdic[i][1]) * (26 - i)
            print(sum1)

    except:
        break
发表于 2020-08-30 17:18:28 回复(0)
def beatiful(name):
    dicts = {}
    name = name.lower()
    for i in name:
        if i in dicts:
            dicts[i] += 1
        else:
            dicts[i] = 1
    weights = list(range(26,0,-1))
    val = sorted(list(dicts.values()),reverse = True)
    sumval = 0
    for i in range(len(val)):
        sumval += val[i]*weights[i]
    return sumval

while True:
    try:
        n = int(input())
        name_list = []
        for i in range(n):
            name_list.append(raw_input())
        for name in name_list:
            print(beatiful(name))
    except:
        break

发表于 2020-06-11 17:52:49 回复(0)
def beauty(name):
    nameset = set(name)
    countlist = []
    for i in nameset:
        countlist.append(name.count(i))
    newlist = sorted(countlist)
    newlist.reverse()
    value, beauty_degree = 26, 0
    for j in range(len(newlist)):
        beauty_degree += newlist[j]*value
        value -= 1
    return beauty_degree   

while 1:
    try:
        N = int(input())
        for i in range(N):
            print(beauty(input()))
    except:
        break
      
对字母出现次数进行排序,并对出现频率高的分配大的值即可
发表于 2020-05-04 09:49:17 回复(0)
import collections
while True:
    try:
        N = int(input())
        for i in range(N):
            name = input()
            degree = 0
            init = 26
            # 用collections.Counter模块来计算每个字母出现的次数
            count = collections.Counter(name)
            for v in sorted(count.values(),reverse = True):
                degree += init * v
                init -= 1
            print(degree)
    except:
        break
发表于 2020-03-01 18:11:58 回复(0)
while True:
  try:
    a = int(input())
    while a:
      b,c,d = input(),{},0
      # 去重存入字典
      for i in b:
        if i not in c:
          c[i] = 1
        else:
          c[i] += 1
      # 排序
      e = sorted(c.values(),reverse = True)
      pl = 26
      for i in e:
        d += i*pl
        pl -= 1
      print(d)
      a -= 1
  except:
    break

发表于 2020-02-20 10:57:17 回复(0)
# str转换成list
def str2list(s):
    l=[v for v in s]
    return l

def beautiful_degree(s):
    l=str2list(s)#['l','i','s','i']
    ans=0
    dic={}
    for i in l:
        if i in dic:
            dic[i]+=1
        else:
            dic[i]=1
    # dic={'l':1,'i':2,'s':1}
    lst=sorted(dic.items(), key=lambda x: x[1], reverse=True)  # 按字典的value排序(倒序)
    # lst=[(i,2),(s,1),(l,1)]
    abc = [k for k in range(26, 0, -1)]#[26,25,24....]
    for j in range(len(lst)):
        ans += lst[j][1]*abc[j]
    return ans


while True:
    try:
        n=int(input())# 多少个名字
        li=[]
        for i in range(n):
            name=input()
            li.append(name)
        #li=['zhangsan','lisi']
        for j in range(len(li)):
            print(beautiful_degree(li[j]))
    except:
        break
很多人题意看不明白,其实就是出现次数最多的字母漂亮度是26,第二多的是25...以此类推。最后累计加和,这样整个单词的漂亮度最高,附代码。
发表于 2020-02-17 15:50:49 回复(10)
while True:
    try:
        N=int(input())
        for _ in range(N):
            dic={}
            s=list(map(lambda x:x.lower(),list(input())))
            for i in s:
                dic[i]=dic.get(i,0)+1
            dic=sorted(dic.items(),key=lambda x:x[1],reverse=True)
            res,num=0,26
            for i in dic:
                res+=i[1]*num
                num-=1
            print(res)
    except:
        break
发表于 2020-02-14 16:24:05 回复(0)
# -*- coding: utf-8 -*-
# !/usr/bin/python3
# 解题思路:26 * 出现次数最多的字母出现的次数 + 25 * 次多的次数
# + 24 * 第三多的次数 + ... + 1 * 第26多的次数

while True:
    try:
        m = int(input())

        while m > 0:
            dic = {}
            s = input()
            for i in s:
                if i not in dic:
                    dic[i] = 1
                else:
                    dic[i] += 1

            ls = dic.values()
            ls = sorted(ls, reverse=True)
            res = 0

            for i in range(len(ls)):
                res += (26 - i) * ls[i]

            print(res)
            m -= 1

    except:
        break

发表于 2019-11-25 20:10:00 回复(0)

问题信息

难度:
28条回答 37499浏览

热门推荐

通过挑战的用户

查看代码