文字列を数値に符号化し、数値の最大と問題を求める(今日の最初の筆記試験問題)
私はかつてブログの中でこのテーマを詳しく解いたことがあって、具体的な住所はhttp://blog.csdn.net/guozhenqiang19921021/article/details/51268005ああ、読者はまずその文章を読んでから、次の内容を見ます.
今日またこの問題について話します.今日の問題は前の問題とよく似ています.ただ一つ違いがあります.それは、符号化された各文字列のトップに0が現れないことです.それは、すべての文字列のトップに現れた文字を0に符号化できないことを意味します.では、私たちはどうすればいいですか.
解法はこのようにして、以下のコード理解と結びつけて、やはり前のやり方で、コードを編成した後、まず総和を計算するのを急ぐのではなく、10要素の文字配列ch 2[10]を再構築し、すべての文字列の頭文字を探し出し、構築したばかりの文字配列ch 2[]に置き、またポインタq=0を設定する必要がある.次に、現在0に符号化されている文字をその文字配列から検索し、存在する場合は(++q)に符号化された文字と置き換え、置き換えが完了したら、存在しないまで最初からスキャンを開始します.
改善されたJavaコードは次のとおりです.
テストサンプルの出力結果は次のとおりです.
2 ABC BCDAA 0対応E,1対応F,2対応G,3対応H,4対応I,5対応J,6対応D,7対応A,8対応C,9対応B, 合計:99475
今日またこの問題について話します.今日の問題は前の問題とよく似ています.ただ一つ違いがあります.それは、符号化された各文字列のトップに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