• [LeetCode] 299. Bulls and Cows


    You are playing the Bulls and Cows game with your friend.

    You write down a secret number and ask your friend to guess what the number is. When your friend makes a guess, you provide a hint with the following info:

    • The number of "bulls", which are digits in the guess that are in the correct position.
    • The number of "cows", which are digits in the guess that are in your secret number but are located in the wrong position. Specifically, the non-bull digits in the guess that could be rearranged such that they become bulls.

    Given the secret number secret and your friend's guess guess, return the hint for your friend's guess.

    The hint should be formatted as "xAyB", where x is the number of bulls and y is the number of cows. Note that both secret and guess may contain duplicate digits.

    Example 1:

    Input: secret = "1807", guess = "7810"
    Output: "1A3B"
    Explanation: Bulls are connected with a '|' and cows are underlined:
    "1807"
      |
    "7810"

    Example 2:

    Input: secret = "1123", guess = "0111"
    Output: "1A1B"
    Explanation: Bulls are connected with a '|' and cows are underlined:
    "1123"        "1123"
      |      or     |
    "0111"        "0111"
    Note that only one of the two unmatched 1s is counted as a cow since the non-bull digits can only be rearranged to allow one 1 to be a bull.
    

    Example 3:

    Input: secret = "1", guess = "0"
    Output: "0A0B"
    

    Example 4:

    Input: secret = "1", guess = "1"
    Output: "1A0B"

    Constraints:

    • 1 <= secret.length, guess.length <= 1000
    • secret.length == guess.length
    • secret and guess consist of digits only.

    猜数字游戏。

    你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:

    你写出一个秘密数字,并请朋友猜这个数字是多少。
    朋友每猜测一次,你就会给他一个提示,告诉他的猜测数字中有多少位属于数字和确切位置都猜对了(称为“Bulls”, 公牛),有多少位属于数字猜对了但是位置不对(称为“Cows”, 奶牛)。
    朋友根据提示继续猜,直到猜出秘密数字。
    请写出一个根据秘密数字和朋友的猜测数返回提示的函数,返回字符串的格式为 xAyB ,x 和 y 都是数字,A 表示公牛,用 B 表示奶牛。

    xA 表示有 x 位数字出现在秘密数字中,且位置都与秘密数字一致。
    yB 表示有 y 位数字出现在秘密数字中,但位置与秘密数字不一致。
    请注意秘密数字和朋友的猜测数都可能含有重复数字,每位数字只能统计一次。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/bulls-and-cows
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这道题不涉及任何算法,思路也比较简单。用一个 for loop 遍历 secret 和 guess,当在同一位置上的数字相同时,就 bulls++,说明在同样位置找到了正确的字母;但是当同一位置上的字母不同的时候,则分别用两个num数组记录 secret 和 guess 这个位置上出现的数字分别是什么。input 遍历完之后,再遍历一遍刚才的 num 数组,在数组中相同位置上的次数,取较小的那个,记为 cows。最后再把字符串按规则拼接好输出即可。

    这道题还有一个更优化的解法,只扫描一次,但是面试不容易想起来,仅供参考。

    时间O(n)

    空间O(n)

    Java实现

     1 class Solution {
     2     public String getHint(String secret, String guess) {
     3         int bulls = 0;
     4         int[] nums1 = new int[10];
     5         int[] nums2 = new int[10];
     6         for (int i = 0; i < secret.length(); i++) {
     7             char s = secret.charAt(i);
     8             char g = guess.charAt(i);
     9             if (s == g) {
    10                 bulls++;
    11             } else {
    12                 nums1[s - '0']++;
    13                 nums2[g - '0']++;
    14             }
    15         }
    16         int cows = 0;
    17         for (int i = 0; i < 10; i++) {
    18             cows += Math.min(nums1[i], nums2[i]);
    19         }
    20         String res = bulls + "A" + cows + "B";
    21         return res;
    22     }
    23 }

    LeetCode 题目总结

  • 相关阅读:
    家庭记事本开发进度1
    仓库信息管理系统
    文件与流动手动脑和课后作业
    课堂测试
    Java异常处理
    动手动脑五
    动手动脑4
    记录类的个数
    数据结构
    操作系统
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13649374.html
Copyright © 2020-2023  润新知