最大映射

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


输入描述:

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



输出描述:

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


输入例子:
2
ABC
BCA

输出例子:
1875

解析:通过每个字符分配权重来分配数字,比如出现的各位的分配1,十位的分配10,百位的分配100,以此类推,注意求出每个字母的权重后,要逐一扫描每个字母是否出现在某个字符串的开头,如果分配为0的字母做了某个字符串的开头,则需要找到权值最小的且没有做过某个字符串开头的字母,将他赋予0,其他的依次往上移动。
代码如下:
package com.itheima.WanMeiShiJie;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;


class Table{
 public char s;
 public long weight;
 public boolean isshow;
	public Table(char s1,long w)
	{
		this.s=s1;
		this.weight=w;
		this.isshow=false;
	}
	
}
public class Test1 {
    
	public static long calc(String s,Table[] t)
	{
		   StringBuilder result=new StringBuilder();
		  for(int i=0;i<s.length();i++)
		  {
			  int index=find(s.charAt(i),t);
			  if(index!=-1)
			  {
		         result.append(9-index);
				  
			  }
			  
		  }   
		return Long.parseLong(result.toString());
	}
	public static int find(char c, Table[] t)
	{
		for(int i=0;i<t.length;i++)
		{
			if(c==t[i].s)
			{
				return i;
			}
			
		}
		return -1;
	}
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
		int n=sc.nextInt();
		sc.nextLine();
		String[] s=new String[n];
		for(int i=0;i<s.length;i++)
		{
			s[i]=sc.nextLine();
			
		}
        Table[] table=new Table[10];
        for(int i=0;i<table.length;i++)
        {
        	table[i]=new Table((char)(65+i),0);
        }
		for(int i=0;i<n;i++)
		{     
			for(int j=0;j<s[i].length();j++)
			{
				
				switch(s[i].charAt(j))
				{
				case 'A':table[0].weight+=Math.pow(10,s[i].length()-j-1);
				break;
				case 'B':table[1].weight+=Math.pow(10,s[i].length()-j-1);
				break;
				case 'C':table[2].weight+=Math.pow(10,s[i].length()-j-1);
				break;
				case 'D':table[3].weight+=Math.pow(10,s[i].length()-j-1);
				break;
				case 'E':table[4].weight+=Math.pow(10,s[i].length()-j-1);
				break;
				case 'F':table[5].weight+=Math.pow(10,s[i].length()-j-1);
				break;
				case 'G':table[6].weight+=Math.pow(10,s[i].length()-j-1);
				break;
				case 'H':table[7].weight+=Math.pow(10,s[i].length()-j-1);
				break;
				case 'I':table[8].weight+=Math.pow(10,s[i].length()-j-1);
				break;
				case 'J':table[9].weight+=Math.pow(10,s[i].length()-j-1);
				break;	
				
				}
				
				
			}
		}
	
	Arrays.sort(table, new Comparator<Table>(){
		
		@Override
		public int compare(Table o1, Table o2) {
			if(o1.weight>o2.weight)
			return -1;
			else if(o1.weight<o2.weight)
				return 1;
			else
				return 0;
		}

	});
	
	for(int i=0;i<table.length;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(table[i].s==s[j].charAt(0))
			{
				table[i].isshow=true;
			}
		}
		
	}
	
	if(table[9].isshow==true)
	{  
		int pos=0;
		for(int j=8;j>=0;j--)
		{
			if(table[j].isshow==false)
			{
				pos=j;
				break;
			}
		}
  /*    Table temp;
      temp=table[pos];
      table[pos]=table[9];
	  table[9]=temp;*/
	Table temp=new Table(table[pos].s,table[pos].weight);
	for(int k=pos+1;k<=9;k++)
	{
		table[k-1]=table[k];
	}
	table[9]=temp;	
	}
	
   /*for(int i=0;i<table.length;i++)
   {
	   System.out.println(table[i].s+"-->"+table[i].weight);
	   
   }*/
	
    long sum=0;
    
    for(int i=0;i<n;i++)
    {
    sum=sum+calc(s[i],table);		
    }
	
	System.out.println(sum);
	}	
	}
}








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值