百練之垂直直方圖
阿新 • • 發佈:2018-12-27
剛開始是用集合的方法實現,理論上來說是沒什麼問題的,測試用例通過了,但是提交的時候RE,無論怎樣也算是複習知識點所以還是記錄一下
package poj_online; import java.util.Iterator; import java.util.Map; import java.util.Scanner; import java.util.Set; import java.util.TreeMap; public class Hist { public static void main(String args[]){ Scanner scan=new Scanner(System.in); Map<Character,Integer> tm=new TreeMap<Character,Integer>(); Character c; for(int i=0;i<4;i++){ String str=scan.nextLine(); for(int j=0;j<str.length();j++){ c=str.charAt(j); if(c>='A'&&c<='Z'){ if(tm.get(c)==null) tm.put(c,1); else tm.put(c, tm.get(c)+1); } } } int max=0; int value=0; Set<Map.Entry<Character, Integer>> me=tm.entrySet(); Iterator<Map.Entry<Character, Integer>> it=me.iterator(); while(it.hasNext()){ value=it.next().getValue(); if(value>max) max=value; } Character [][]arr=new Character[max][26]; for(int j=0;j<26;j++){ for(int i=0;i<max;i++){ if(tm.get((char)(j+'A'))>i) arr[i][j]='*'; else arr[i][j]=' '; } } for(int i=max-1;i>=0;i--){ for(int j=0;j<25;j++) System.out.print(arr[i][j]+" "); System.out.println(arr[i][25]); } for(int i=0;i<25;i++){ System.out.print((char)('A'+i)+" "); } System.out.println("Z"); } }
RE之後反應過來沒必要搞這麼複雜,直接陣列就行,就一個長度為26的陣列代表26個英文字母,數組裡儲存的數就是每個字母出此案的次數,思路非常直接了
程式碼如下:
package poj_online; import java.util.Scanner; public class NewHist { public static void main(String args[]){ Scanner scan=new Scanner(System.in); int []a=new int[26]; for(int i=0;i<4;i++){ String s=scan.nextLine(); for(int j=0;j<s.length();j++){ if(s.charAt(j)>='A'&&s.charAt(j)<='Z'){ a[s.charAt(j)-'A']++; } } } int max=0; for(int i=0;i<26;i++){ if(a[i]>max) max=a[i]; } /*System.out.println(max); System.out.println(); for(int i=0;i<26;i++) System.out.print(a[i]+" ");*/ for(int i=max;i>=1;i--){ for(int j=0;j<26;j++){ if(i>a[j]) System.out.print(" "); else System.out.print("* "); } System.out.println(); } for(char c='A';c<='Z';c++) System.out.print(c+" "); } }
圖片如下:相比於集合的方法,在記憶體和執行時間方面都沒有明顯變化,用陣列之後反而增大了,只是程式碼長度明顯小一些,所以對於為什麼之前RE而之後EC我真是非常不能理解