1. 程式人生 > >百練之垂直直方圖

百練之垂直直方圖

剛開始是用集合的方法實現,理論上來說是沒什麼問題的,測試用例通過了,但是提交的時候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我真是非常不能理解