---
# System prepended metadata

title: Map題型練習
tags: [apcs, 歷屆練習, 自主學習, 解題筆記]

---

###### tags: `apcs` `解題筆記` `歷屆練習` `自主學習`
{%hackmd BJrTq20hE %}

Map題型練習
===
## Map
一個key對一個value，可以快速運算重複的值或是需要對照的題型
## [APCS歷屆:美麗的彩帶](https://zerojudge.tw/ShowProblem?problemid=e289)
![](https://i.imgur.com/HoesZ2R.jpg)
用HashMap儲存顏色的數量，每次加一個就去頭，再判斷長度是否為m
```java=
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class zj_e289{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		Map<String,Integer> map = new HashMap<>();
		String[]  d = br.readLine().split(" ");
		int m = Integer.parseInt(d[0]);
		int n = Integer.parseInt(d[1]);
		d = br.readLine().split(" ");
		int ans = 0;
		for(int i = 0;i < n;i++) {
			//存在的話+1
			if(map.containsKey(d[i])) {
				map.put(d[i],map.get(d[i]) + 1);
			}
			//不存在，設1
			else
				map.put(d[i], 1);
			if(i > m - 1) {
				//去頭，數量變0就刪掉
				int x = map.get(d[i-m]) - 1;
				if(x == 0)
					map.remove(d[i-m]);
				else
					map.put(d[i-m],x);
			}
			//長度為m時代表是一個完美彩帶
			if(map.size() == m)
				ans++;
		}
		System.out.println(ans);
	}

}


```
