將字符串編碼成數值,求數值最大和問題(今日頭條筆試題)


      我曾經在博客中詳細解過這個題目,具體地址為http://www.cnblogs.com/guozhenqiang/p/5441137.html,讀者先看完那篇文章,

再看下面的內容:

      今天又來談論這個問題,今天的問題和之前那個很相像,只有一點不同,那就是要求編碼后的每個字符串首位不能出現0,那就意味着不能

給所有字符串首位出現的字符編碼為0,那么我們應該怎么辦呢?

      我的解法是這樣的,還是之前的做法,在編好碼之后,先不要急於計算總和,而是需要再建立一個10個元素的字符數組ch2[10],把所有的

字符串的首字母找出來,放到剛建立的字符數組ch2[]中,另外設立一個指針q=0,然后把當前編碼為0的字符去該字符數組中查找,如果存在就將

該字符與編碼為(++q)的字符進行替換,替換完之后,再從頭開始開始掃描,直到不存在為止。

      改進后的Java代碼如下:

 1 import java.util.*;
 2 public class Main8 {
 3     public static void main(String[] args) {
 4         // TODO 自動生成的方法存根
 5         Scanner scan=new Scanner(System.in);
 6         int n=Integer.parseInt(scan.nextLine());        //讀入n
 7         String str[]=new String[n];
 8         int maxLength=0;
 9         for(int i=0;i<n;i++)                            //讀入每個字符串,並統計出最長的字符串的長度
10             {
11                str[i]=scan.nextLine();
12                if(str[i].length()>maxLength)maxLength=str[i].length();
13             }
14         int a[][]=new int[10][maxLength];              //開出一個10*最大長度的二維數組
15         for(int i=0;i<n;i++)
16             {
17                if(str[i].length()<maxLength)
18                {   int length=str[i].length();
19                 for(int j=0;j<maxLength-length;j++)   //把長度不夠最大長度的字符串的前面補上無關的任意字符,這里我補的是@字符
20                     str[i]="@"+str[i];
21                }
22                for(int j=0;j<maxLength;j++)          //統計每個字符串每個位上出現字符的頻率,放到頻率數組a[][]中
23                    if(str[i].charAt(j)!='@')         //如果是我之前補得無關字符,則忽略
24                    a[str[i].charAt(j)-'A'][j]++;
25             }
26         long b[]=new long[10];                         //開辟一個用來存儲每個字符的單位和
27         char ch[]={'A','B','C','D','E','F','G','H','I','J'};  //用來和b[]綁定,用來記憶每個字符的位置,因為后面要對b[]排序
28         for(int i=0;i<=9;i++)                        //統計出每個字符出現的基數綜合
29             for(int j=0;j<maxLength;j++)
30                 b[i]=b[i]*10+a[i][j];
31     
32         for(int i=0;i<9;i++)                        //把每個字符的基數值總和進行排序
33             for(int j=i+1;j<10;j++)
34                 if(b[i]>b[j]){
35                     long t=b[i];
36                     b[i]=b[j];
37                     b[j]=t;
38                     char c=ch[i];
39                     ch[i]=ch[j];
40                     ch[j]=c;
41                 }
42         
43         char  ch2[]=new char[10];                 
44         for(int i=0;i<n;i++)                        //將每個字符串的首字母找出來放到ch2[]中
45             for(int j=0;j<maxLength;j++)
46                 if(str[i].charAt(j)!='@'){
47                     ch2[str[i].charAt(j)-'A']=str[i].charAt(j);
48                     break;
49                 }
50         int q=0;                    //附設一個指針
51         for(int i=0;i<10;i++)
52             if(ch2[i]==ch[0]){      //如果存在,就和編碼非0最小的字符交換
53                 char c=ch[0];
54                 ch[0]=ch[++q];
55                 ch[q]=c;
56                 long t=b[0];
57                 b[0]=b[q];
58                 b[q]=t;
59                 i=-1;              //歸位,再從頭開始掃描
60             }
61         
62         long sum=0;                                //用來計算最終的總和
63         for(int i=0;i<=9;i++)
64             {
65               System.out.print(i+"對應"+ch[i]+", ");    //輸出每個數字對應的字符
66               sum=sum+b[i]*i;
67             }
68         System.out.println();
69     
70         System.out.println("總和為:"+sum);           
71     }
72 
73 }

測試樣例輸出結果為:

2
ABC
BCDAA
0對應E, 1對應F, 2對應G, 3對應H, 4對應I, 5對應J, 6對應D, 7對應A, 8對應C, 9對應B,
總和為:99475


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com