今日头条2017后端工程师实习生笔试题——最大映射

来源:互联网 发布:java软件工程师辛苦么 编辑:程序博客网 时间:2024/05/21 07:52
[编程题] 最大映射

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


输入描述:

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



输出描述:

输出一个数,表示最大和是多少。


输入例子:
2ABCBCA

输出例子:
1875
import java.util.Arrays;import java.util.Scanner;public class Main{public static void main(String[] args){long[] scores=new long[100];boolean[] flag=new boolean[100];int nums;Scanner sc=new Scanner(System.in);while(sc.hasNextInt()){nums=sc.nextInt();for(int m=0;m<10;m++){scores[m]=0l;flag[m]=false;}for(int i=0;i<nums;i++){String a=sc.next();int la=a.length();for(int j=0;j<la;j++){int indexnow=a.charAt(j)-65;scores[indexnow]+=(long)(Math.pow(10,la-j-1));if(j==0&&la>1)flag[indexnow]=true;}}int digit=1,firstdigit=1;long result=0;long firstDigit=5000000000000l;for(int i=0;i<10;i++){if(scores[i]<firstDigit&&flag[i]==false){firstDigit=scores[i];firstdigit=i;}}for(int i=firstdigit;i<9;i++){scores[i]=scores[i+1];}Arrays.sort(scores,0,9);for(int i=0;i<9;i++){result+=scores[i]*digit;digit++;}System.out.println(result);}}}

1 0