[LeetCode] Bulls and Cows

You are playing the following Bulls and Cows game with your friend: You write a 4-digit secret number and ask your friend to guess it. Each time your friend guesses a number, you give a hint. The hint tells your friend how many digits are in the correct positions (called “bulls”) and how many digits are in the wrong positions (called “cows”). Your friend will use those hints to find out the secret number.

For example:

Secret number: “1807”
Friend’s guess: “7810”

Hint: 1 bull and 3 cows. (The bull is 8, the cows are 0, 1 and 7.)
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. In the above example, your function should return "1A3B".

Please note that both secret number and friend’s guess may contain duplicate digits, for example:

Secret number: “1123”
Friend’s guess: “0111”

In this case, the 1st 1 in friend’s guess is a bull, the 2nd or 3rd 1 is a cow, and your function should return "1A1B".
You may assume that the secret number and your friend’s guess only contain digits, and their lengths are always equal.

解题思路

  1. 扫描secret字符串,记录各个字符的个数。
  2. 扫描两遍guess字符串:
    ①第一遍记录字符正确且位置也正确的字符。
    ②第二遍记录字符正确但位置不正确的字符。

实现代码

C++:

// Runtime: 20ms
class Solution {
public:
    string getHint(string secret, string guess) {
        unordered_map<char, int> mymap;
        vector<bool> tag(secret.size(), false);
        for (int i = 0; i < secret.size(); i++) {
            mymap[secret[i]]++;
        }

        int cntA = 0;
        int cntB = 0;
        for (int i = 0; i < guess.size(); i++) {
            if (secret[i] == guess[i]) {
                ++cntA;
                tag[i] = true;
                mymap[guess[i]]--;
            }
        }

        for (int i = 0; i < guess.size(); i++) {
            if (!tag[i] && mymap[guess[i]] > 0) {
                cntB++;
                mymap[guess[i]]--;
            }
        }

        return to_string(cntA) + "A" + to_string(cntB) + "B";
    }
private:
    string to_string(int n) {
        if (n == 0)
        {
            return "0";
        }
        string res = "";
        while (n)
        {
            res += n % 10 + '0';
            n /= 10;
        }
        reverse(res.begin(), res.end());

        return res;
    }
};

Java:

// Runtime: 18ms
public class Solution {
    public String getHint(String secret, String guess) {
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        boolean tag[] = new boolean[secret.length()];
        for (int i = 0; i < secret.length(); i++) {
            if (map.containsKey(secret.charAt(i))) {
                map.replace(secret.charAt(i), map.get(secret.charAt(i)) + 1);
            }
            else {
                map.put(secret.charAt(i), 1);
            }
        }

        int a = 0, b = 0;
        for (int i = 0; i < guess.length(); i++) {
            if(secret.charAt(i) == guess.charAt(i)) {
                ++a;
                map.replace(guess.charAt(i), map.get(guess.charAt(i)) - 1);
                tag[i] = true;
            }
        }

        for (int i = 0; i < guess.length(); i++) {
            if (!tag[i] && map.containsKey(guess.charAt(i)) && map.get(guess.charAt(i)) > 0) {
                ++b;
                map.replace(guess.charAt(i), map.get(guess.charAt(i)) - 1);
            }
        }

        return a + "A" + b + "B";
    }
}
时间: 2024-07-29 13:48:02

[LeetCode] Bulls and Cows的相关文章

[LeetCode]--299. Bulls and Cows

You are playing the following 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 yo

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

UVa 10491 Cows and Cars:概率及广义三门问题

10491 - Cows and Cars Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=1432 In television contests, participants are often asked to choose one from a set

关于java越界的问题。。。。请大神解答

问题描述 关于java越界的问题....请大神解答 public class Solution { public String getHint(String secret, String guess) { int bulls=0; int cows=0; char[] sec = secret.toCharArray(); char[] gue = guess.toCharArray(); int[] s=new int[10]; int[] g=new int[10]; for(int i=0

代码分析-leetcode:Scramble String问题

问题描述 leetcode:Scramble String问题 题目:Given a string s1 we may represent it as a binary tree by partitioning it to two non-empty substrings recursively. Below is one possible representation of s1 = ""great"": great / gr eat / / g r e at /

c++-leetcode Median of Two Sorted Arrays

问题描述 leetcode Median of Two Sorted Arrays class Solution { public: double findMedianSortedArrays(vector& nums1, vector& nums2) { if(nums1.size()==0){ if(nums2.size()%2==0)return ((double)nums2[nums2.size()/2]+nums2[nums2.size()/2-1])/2.0; else ret

[LeetCode]61.Rotate List

[题目] Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL. [题意] 给定一个链表,向右旋转k个位置,其中k是非负的. [分析] 先遍历一遍,得出链表长度 len,注意 k 可能大于

[LeetCode]91.Decode Ways

题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' -> 1 'B' -> 2 - 'Z' -> 26 Given an encoded message containing digits, determine the total number of ways to decode it. For example, Given encode

LeetCode总结之二分查找篇

二分查找算法虽然简单,但面试中也比较常见,经常用来在有序的数列查找某个特定的位置.在LeetCode用到此算法的主要题目有: Search Insert Position Search for a Range Sqrt(x) Search a 2D Matrix Search in Rotated Sorted Array Search in Rotated Sorted Array II 这类题目基本可以分为如下四种题型: 1. Search Insert Position和Search fo