[Algorithm] 🎴白駿10816デジタルカード2


0、問題


デジタルカードは整数と書かれたカードです.尚根にはN枚のデジタルカードがあります.整数M個を指定する場合は、この数が書かれた数値カードがルートに何個あるかを求めるプログラムを作成します.
入力
1行目には、上位のデジタルカードの個数N(1≦N≦500000)が与えられる.2行目には、数値カードの整数が表示されます.デジタルカードに書かれている数字は-1000000以上、1000000未満です.
3行目はM(1≦M≦500000)を与える.4行目には、上のルートがいくつかの数値カードであることを求めるためにスペースで区切られたM個の整数が与えられる.この数-1000000以上、1000000未満です.
しゅつりょく
1行目に入力したM個の数字については、各数字が書かれた数字カードをスペースで区切って出力します.

1.アイデア


HashMapの使用
💡 キー値としてカードの数字を使用
💡 最初の数字はvalue 1に格納され、すでに現れた数字はvalue+1に格納されます.
💡 mの数字がキー値であるかどうかを確認し、valueを出力します.

2.コア解答


1)最初の数字はvalue 1に格納され、出現した数字はvalue+1に格納される
if(map.containsKey(num)) {
	map.put(num,map.get(num)+1);
} else {
	map.put(num, 1);
}
2)mの数字がキー値かどうかをチェックし、valueを出力する
if(map.containsKey(num))
	sb.append(map.get(num));
else
	sb.append("0");
sb.append(" ");

3.コード

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
public class Hash_3 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		HashMap<Integer, Integer> map = new HashMap<>();

		String[] s = br.readLine().split(" ");
		
		for(int i=0; i<n; i++) {
			int num = Integer.parseInt(s[i]);
			
			if(map.containsKey(num)) {
				map.put(num,map.get(num)+1);
			} else {
				map.put(num, 1);
			}
		}
		
		int m = Integer.parseInt(br.readLine());
		s = br.readLine().split(" ");
		StringBuilder sb = new StringBuilder();
		
		for(int i=0; i<m; i++) {
			int num = Integer.parseInt(s[i]);
			
			if(map.containsKey(num))
				sb.append(map.get(num));
			else
				sb.append("0");
			sb.append(" ");
		}
		
		System.out.println(sb.toString());
	}

}

4.結果



成功
最初はシステムでした.out.println(map.get(num)+")にタイムアウトが発生しました.
+""演算には多くの時間がかかります.
これからはStringBuilderかBufferedWriterを活用して...