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

最大映射

有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?
输入描述:每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母。
输出描述:输出一个数,表示最大和是多少。
输入例子:
2
ABC
BCA
输出例子:
1875

思路

以题目的输入例子分析计算过程

ABC=100×A+10×B+C
BCA=100×B+10×C+A
则ABC+BCA=110×B+101×A+11×C(根据权值从大到小排序)。

要使和最大,则权值越大的映射的数字应越大,即B=9,A=8,C=7,故最大和为1875.
可以将n个字符串相加,根据以上方法求出每个字符的权值,并根据权值大小对字符从大到小进行排序。权值越大映射数字越大。注意,题目中要求了字符串不能有前导零,我们可以用一个标识符记录每个字符是否可为0。若权值最低的字符不能为0,则向前寻找可以为0且权重最小的字符,用该字符与权值最低的字符交换,同时权重向前移。。。例如

字符 权重 是否可为0(0表示可以)
A 100 1
J 11 1
C 10 0
D 9 0
E 8 1
B 7 0
G 6 0
H 5 1
I 4 1
F 3 1
权重最低的字符为F,它的标识符为0,则该字符可以为0,故寻找权重最小且可以为0的字符,在这个问题中,该字符为G。交换并向前移。即

字符 权重 是否可为0(1表示可以)
A 100 1
J 11 1
C 10 0
D 9 0
E 8 1
B 7 0
H 5 1
I 4 1
F 3 1
G 6 0

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main{
   
    public static void main(String []args){
        Scanner cin=new Scanner(System.in);
        int n;
        while(cin.hasNext()){
            n=cin.nextInt();
            String[]str=new String[n];
            Element[]e=new Element[10];
            for(int i=0;i<10;i++)e[i]=new Element();
            for(int i=0;i<n;i++){
                str[i]=cin.next();
                int l=str[i].length();
                long base=1;
                for(int j=l-1;j>=0;j--,base*=<
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值