每天一道编程题——最大映射

有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?

输入描述:
每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母。
输出描述:
输出一个数,表示最大和是多少。

输入例子:
2
ABC
BCA
输出例子:
1875

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def func(strings_list):
the_all_big = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J')
D = {i: {j: 0 for j in the_all_big} for i in range(1, 12 + 1)}
G = {i: 0 for i in the_all_big}
# 结果;集合去重
result, h = 0, set(i[0] for i in strings_list)
# 计算个数
for each_string in strings_list:
for i, a in enumerate(reversed(each_string), 1):
D[i][a] += 1
# 计算权值
for i in range(1, 12 + 1):
for a, j in D[i].items():
if i 0: G[a] += j * 10 ** (i - 1)
sorted_result = sorted(G.iteritems(), key=lambda k: k[1])
for i in range(0, 10):
# 开头不能为0
if i == 0:
for j in range(0, 10):
if sorted_result[j][0] not in h:
sorted_result.pop(j)
break
else:
result += i * sorted_result[i - 1][1]
return result
if __name__ == '__main__':
while True:
try:
strings_list = [raw_input() for i in range(int(raw_input()))]
print func(strings_list)
except:
break

来自今日头条2017后端工程师实习生笔试题

文章目录
|