文字列を数値に符号化し、数値の最大と問題を求める(今日の最初の筆記試験問題)


私はかつてブログの中でこのテーマを詳しく解いたことがあって、具体的な住所はhttp://blog.csdn.net/guozhenqiang19921021/article/details/51268005ああ、読者はまずその文章を読んでから、次の内容を見ます.
     今日またこの問題について話します.今日の問題は前の問題とよく似ています.ただ一つ違いがあります.それは、符号化された各文字列のトップに0が現れないことです.それは、すべての文字列のトップに現れた文字を0に符号化できないことを意味します.では、私たちはどうすればいいですか.
      解法はこのようにして、以下のコード理解と結びつけて、やはり前のやり方で、コードを編成した後、まず総和を計算するのを急ぐのではなく、10要素の文字配列ch 2[10]を再構築し、すべての文字列の頭文字を探し出し、構築したばかりの文字配列ch 2[]に置き、またポインタq=0を設定する必要がある.次に、現在0に符号化されている文字をその文字配列から検索し、存在する場合は(++q)に符号化された文字と置き換え、置き換えが完了したら、存在しないまで最初からスキャンを開始します.
改善されたJavaコードは次のとおりです.
import java.util.*;
public class Main8 {
	public static void main(String[] args) {
		// TODO          
		Scanner scan=new Scanner(System.in);
		int n=Integer.parseInt(scan.nextLine());        //  n
		String str[]=new String[n];
		int maxLength=0;
		for(int i=0;i<n;i++)                            //       ,             
			{
			   str[i]=scan.nextLine();
		       if(str[i].length()>maxLength)maxLength=str[i].length();
			}
		int a[][]=new int[10][maxLength];              //    10*         
		for(int i=0;i<n;i++)
			{
			   if(str[i].length()<maxLength)
			   {   int length=str[i].length();
				for(int j=0;j<maxLength-length;j++)   //                         ,      @  
					str[i]="@"+str[i];
			   }
		       for(int j=0;j<maxLength;j++)          //                  ,      a[][] 
		    	   if(str[i].charAt(j)!='@')         //            ,   
		    	   a[str[i].charAt(j)-'A'][j]++;
			}
		long b[]=new long[10];                         //                
		char ch[]={'A','B','C','D','E','F','G','H','I','J'};  //   b[]  ,           ,      b[]  
		for(int i=0;i<=9;i++)                        //              
			for(int j=0;j<maxLength;j++)
				b[i]=b[i]*10+a[i][j];
	
		for(int i=0;i<9;i++)                        //               
			for(int j=i+1;j<10;j++)
				if(b[i]>b[j]){
					long t=b[i];
					b[i]=b[j];
					b[j]=t;
					char c=ch[i];
					ch[i]=ch[j];
					ch[j]=c;
				}
		
		char  ch2[]=new char[10];                 
		for(int i=0;i<n;i++)                        //               ch2[] 
			for(int j=0;j<maxLength;j++)
				if(str[i].charAt(j)!='@'){
					ch2[str[i].charAt(j)-'A']=str[i].charAt(j);
					break;
				}
		int q=0;                    //      
		for(int i=0;i<10;i++)
			if(ch2[i]==ch[0]){      //    ,     0       
				char c=ch[0];
				ch[0]=ch[++q];
				ch[q]=c;
				long t=b[0];
				b[0]=b[q];
				b[q]=t;
				i=-1;              //  ,       
			}
		
		long sum=0;                                //         
		for(int i=0;i<=9;i++)
			{
			  System.out.print(i+"  "+ch[i]+", ");	//           
		      sum=sum+b[i]*i;
		    }
		System.out.println();
	
		System.out.println("   :"+sum);  		 
	}

}

テストサンプルの出力結果は次のとおりです.
2 ABC BCDAA 0対応E,1対応F,2対応G,3対応H,4対応I,5対応J,6対応D,7対応A,8対応C,9対応B,  合計:99475