题目:

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 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.

For example:

Secret number:  "1807"
Friend's guess: "7810"

Hint: 1 bull and 3 cows. (The bull is 8, the cows are 01 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.

链接: http://leetcode.com/problems/bulls-and-cows/

题解:

公牛和奶牛游戏。使用HashMap存下来secret里的字符和count,然后同时遍历secret和guess就可以了。最后还要遍历一次map把多加的cow减掉。

Time Complexity - O(n), Space Complexity - O(n)

public class Solution {
public String getHint(String secret, String guess) {
if(secret == null || guess == null || secret.length() != guess.length()) {
return "0A0B";
}
int bulls = 0, cows = 0;
Map<Character, Integer> map = new HashMap<>(); for(int i = 0; i < secret.length(); i++) {
char c = secret.charAt(i);
if(!map.containsKey(c)) {
map.put(c, 1);
} else {
map.put(c, map.get(c) + 1);
}
} for(int i = 0; i < secret.length(); i++) {
char sChar = secret.charAt(i);
char gChar = guess.charAt(i);
if(sChar == gChar) {
bulls++;
map.put(gChar, map.get(gChar) - 1);
} else if(map.containsKey(gChar)) {
cows++;
map.put(gChar, map.get(gChar) - 1);
}
} for(char c : map.keySet()) {
if(map.get(c) < 0) {
cows += map.get(c);
}
} return String.valueOf(bulls) + "A" + String.valueOf(cows) + "B";
}
}

二刷:

主要参考了Discuss里面的解。

  1. 我们可以用一个数组来存bulls和cows。用s和g来表示数组的数字值
  2. 当 s = g时,我们找到了bull, bulls++
  3. 否则我们要看
    1. nums[g] > 0的话,说明当前guess的这个数字曾经出现在secret中,这是一个cow,我们cow++
    2. 我们也要看是否nums[s] < 0, 这个表明当前ssecret的数字曾经出现在guess中,这也是一个cow,我们还是cow++
    3. 我们用正数记录下nums[s]为bull的一个位置,nums[s]++,  我们也用负数记录下guess中出现过的数字,nums[g]--,

Java:

Time Complexity - O(n), Space Complexity - O(1)

public class Solution {
public String getHint(String secret, String guess) {
if(secret == null || guess == null || secret.length() != guess.length()) {
return "0A0B";
}
int[] nums = new int[10];
for (int i = 0; i < secret.length(); i++) {
int s = secret.charAt(i) - '0';
int g = guess.charAt(i) - '0';
if (s == g) {
bulls++;
} else {
if (nums[s] < 0) { // bulls can be counted as cows
cows++;
}
if (nums[g] > 0) { // found num but in diff position
cows++;
}
nums[s]++;
nums[g]--;
}
}
return bulls + "A" + cows + "B";
}
}

三刷:

延续了二刷的解法。主要使用一个count[]数组保存之前出现过的secret digits和guess digits。当前sDigit == gDigit时,bulls增加。 否则, 当count[sDigit] < 0时,说明之前出现在guess里, 当count[gDigit] > 0时,说明之前出现在secret里,这两种情况都要分别增加cows。之后再记录i这个位置的改动count[sDigit]++, count[gDigit]--。最后返回结果。

Java:

public class Solution {
public String getHint(String secret, String guess) {
if (secret == null || guess == null || secret.length() != guess.length()) {
return "0A0B";
}
int bulls = 0;
int cows = 0;
int[] count = new int[10];
for (int i = 0; i < secret.length(); i++) {
int sDigit = secret.charAt(i) - '0';
int gDigit = guess.charAt(i) - '0';
if (sDigit == gDigit) {
bulls++;
} else {
if (count[sDigit] < 0) {
cows++;
}
if (count[gDigit] > 0) {
cows++;
}
}
count[sDigit]++;
count[gDigit]--;
}
return bulls + "A" + cows + "B";
}
}

Update:

public class Solution {
public String getHint(String secret, String guess) {
if (secret == null || guess == null || secret.length() != guess.length()) return "0A0B";
int bullsCount = 0, cowsCount = 0;
int len = secret.length();
int[] count = new int[10]; for (int i = 0; i < len; i++) {
int sc = secret.charAt(i) - '0';
int gc = guess.charAt(i) - '0';
if (sc == gc) {
bullsCount++;
} else {
if (count[gc] > 0) cowsCount++;
if (count[sc] < 0) cowsCount++;
count[sc]++;
count[gc]--;
}
}
return bullsCount + "A" + cowsCount + "B";
}
}

Reference:

https://leetcode.com/discuss/67031/one-pass-java-solution

299. Bulls and Cows的更多相关文章

  1. 【LeetCode】299. Bulls and Cows 解题报告(Python)

    [LeetCode]299. Bulls and Cows 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题 ...

  2. 299. Bulls and Cows - LeetCode

    Question 299. Bulls and Cows Solution 题目大意:有一串隐藏的号码,另一个人会猜一串号码(数目相同),如果号码数字与位置都对了,给一个bull,数字对但位置不对给一 ...

  3. LeetCode 299 Bulls and Cows

    Problem: You are playing the following Bulls and Cows game with your friend: You write down a number ...

  4. 【一天一道LeetCode】#299. Bulls and Cows

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 You are ...

  5. [leetcode]299. Bulls and Cows公牛和母牛

    You are playing the following Bulls and Cows game with your friend: You write down a number and ask ...

  6. 299 Bulls and Cows 猜数字游戏

    你正在和你的朋友玩猜数字(Bulls and Cows)游戏:你写下一个数字让你的朋友猜.每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为”Bulls“, 公牛),有多少位数字 ...

  7. [LC] 299. Bulls and Cows

    Example 1: Input: secret = "1807", guess = "7810" Output: "1A3B" Expla ...

  8. Leetcode 299 Bulls and Cows 字符串处理 统计

    A就是统计猜对的同位同字符的个数 B就是统计统计猜对的不同位同字符的个数 非常简单的题 class Solution { public: string getHint(string secret, s ...

  9. 【leetcode❤python】 299. Bulls and Cows

    #-*- coding: UTF-8 -*-class Solution(object):      def getHint(self, secret, guess):          " ...

随机推荐

  1. Github的使用以及Git的简单入门 - 课程作业三

    GitHub创建项目 登录GitHub,在个人主页创建项目(repository) 创建后会生成2个文件,README.md和.gitignore.如图 创建本地仓库 如果是第一次使用git的话,需要 ...

  2. Gulp的安装

    Gulp 是前端自动化开发工具,我们可以用它提高开发效率. 它有以下用途: 压缩js.压缩css.压缩less.压缩图片等功能 首先我们开始安装Gulp Gulp是基于node来实现的,所以应该先安装 ...

  3. UIlabel 显示模糊

    问题: 今天遇到连续两个label一个显示的比较清楚,比较锐利,而另一个对比下有点模糊. 原因: 在使用UILabel等继承于UIView的控件时,如果frame的rect不是整数的情况下,就会显示起 ...

  4. matrix_last_acm_1

    password 123 A http://acm.hust.edu.cn/vjudge/contest/view.action?cid=96950#problem/A 题意:n个数初始ai,m次操作 ...

  5. 导入ApiDemo报错,找不到R文件

    1.先检查当前ApiDemo对应的SDK版本是否一致(项目右键-Properties-Android) 2.查看是什么错误.我的就是layout中的progressbar_2.xml中所有组件的id前 ...

  6. 简单的表视图UITableView

    1.建一个Single View application 2.在故事板中放置一个Table View控件 3.在.h文件中加入协议 <UITableViewDataSource,UITableV ...

  7. 全球SEO行业调查报告

    这是一份来自MOZ的调查报告,本报告是两年一次的SEO行业调查,主要围绕SEO从业人员的特征.工作内容时间分配比例.对未来市场的看法.使用的seo工具以及SEO知识扩充渠道等展开. 这份报告可以对从事 ...

  8. python实现web分页日志查看

    当我们维护一个网站时,无论前台还是后台,经常会出现各种个样的问题.有时候问题很难直观的发现,这个时候只能查看各种日志来跟踪问题.但是查看日志有各种个样的问题.首先,要用各种工具登陆到服务器,这个有时候 ...

  9. Spring中自动装配(转)

    Spring中有四种自动装配类型,分别为:byName,byType,constructor,autodetect,下面来分别介绍一下这些是如何自动装配的 <bean id="foo& ...

  10. CSS自定义文件上传按钮

    今天一同事问我文件上传按钮的问题,情况是这样的,他页面上有3个按钮,分为左中右三个,左边的位按钮甲,右边的位按钮乙,而中间的就是个文件选择按钮,情况大概是这个样子的: 两边的按钮都有了样式,但中间的选 ...