给出一个字符串,该字符串仅由小写字母组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个字符串,计算每个字符串最大可能的“漂亮度”。
本题含有多组数据。
数据范围:输入的名字长度满足
给出一个字符串,该字符串仅由小写字母组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。
第一行一个整数N,接下来N行每行一个字符串
每个字符串可能的最大漂亮程度
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
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
注意题目思路 可能最大的,也就是统计字母排序 从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
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
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月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
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
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
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对字母出现次数进行排序,并对出现频率高的分配大的值即可
# 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...以此类推。最后累计加和,这样整个单词的漂亮度最高,附代码。
# -*- 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