---
description: 善用 map 存值
---

# # 299 Bulls and Cows (有圖)

[LeetCode](https://leetcode.com/problems/bulls-and-cows/)

You are playing the following [Bulls and Cows](https://en.wikipedia.org/wiki/Bulls_and_Cows) game with your friend: You write down a number and ask your friend to guess what the number is. Each time your friend makes a guess, you provide a hint that indicates how many digits in said guess match your secret number exactly in both digit and position (called "bulls") and how many digits match the secret number but locate in the wrong position (called "cows"). Your friend will use successive guesses and hints to eventually derive the secret number.

Write a function to return a hint according to the secret number and friend's guess, use `A` to indicate the bulls and `B` to indicate the cows.&#x20;

Please note that both secret number and friend's guess may contain duplicate digits.

**Example 1:**

```
Input: secret = "1807", guess = "7810"

Output: "1A3B"

Explanation: 1 bull and 3 cows. The bull is 8, the cows are 0, 1 and 7.
```

**Example 2:**

```
Input: secret = "1123", guess = "0111"

Output: "1A1B"

Explanation: The 1st 1 in friend's guess is a bull, the 2nd or 3rd 1 is a cow.
```

**Note:** You may assume that the secret number and your friend's guess only contain digits, and their lengths are always equal.

### 解釋題目

![](https://1787585077-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LqirD3iAZIDk4oDCfwS%2F-LyVPROdbGWTLerCXHHt%2F-LyVRjylSsl644XasrL0%2F1.jpg?alt=media\&token=ea77b76f-38e4-414d-9bd6-54652ffe8a53)

![](https://1787585077-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LqirD3iAZIDk4oDCfwS%2F-LyVPROdbGWTLerCXHHt%2F-LyVRnR9x4sCgBfoSK0R%2F2.jpg?alt=media\&token=913726f4-8d79-41b0-a8f1-ed3690ce6f70)

另外 input 保證是 digit，Guess 跟 Secret 一定長度一樣．但是 Guess 跟 Secret 都可能有重覆的數字&#x20;

### 如何解

* A 比較好處理，只要 for 一次把 g\[i] === s\[i] 都加進 A 就好
* B 分兩個部分
  * 因為數字有可能重覆，所以我會用一個 map 存 secret (但要排除 A 也就是上面已經判斷過 g\[i] 跟 s\[i] 一樣的值)
  * 然後再 for 一次 guess 對應再 map 裡是否存在
    * 若存在 那 B ++，然後記得 map 裡要 -1
    * 若不存在那不處理

### Code

```
/**
 * @param {string} secret
 * @param {string} guess
 * @return {string}
 */

var getHint = function(secret, guess) {
  let len = secret.length;
  let A = 0, B = 0; 
  let map = new Map();

  // get A and store map
  for(let i = 0; i < len; i++) {
    if(secret[i] === guess[i]){
      A++;
    }else{
      if(map.has(secret[i])){
        map.set(secret[i], map.get(secret[i]) + 1)
      }else{
        map.set(secret[i], 1)
      }
    }
  }

  for(let i = 0; i < len; i++) {
    if(secret[i] !== guess[i]){
      if(map.has(guess[i]) && map.get(guess[i]) > 0){
        B++;
        map.set(guess[i], map.get(guess[i]) - 1)
      }
    }
  }

  return `${A}A${B}B`
};

//  faster than 76.60%
```

### 如何寫得更好?

**codeing style**: 發現自己不太重視，應該要該空格的空格增加可讀性，然後 if else 也可以縮短寫法

```
// get A and store map
  for(let i = 0; i < len; i++) {
    // 縮短寫法
    if(secret[i] === guess[i]) A++;
    // else 後面加空格
    else {
      if(map.has(secret[i])) {
        map.set(secret[i], map.get(secret[i]) + 1)
      }else {
        map.set(secret[i], 1)
      }
    }
  }
```
