LeetCode:Bulls and Cows - 猜数字游戏

1、题目名称

Bulls and Cows(猜数字游戏)

2、题目地址

https://leetcode.com/problems/bulls-and-cows/

3、题目内容

英文: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.

中文:假设你正在玩猜数字游戏(Bulls and Cows):你写出4个数字让你的朋友猜,每次你的朋友猜一个数字,你给出一条线索,这个线索告诉你的朋友,有多少个数字位置是正确的(被称为Bulls),有多少个数字位置是不正确的(被称为Cows),你的朋友需要根据这些线索最终猜出正确的数字。

例如,给出的数字是1807,你的朋友猜的是7810,这里用A代表Bulls,B代表Cows,则给出的线索是1A3B。

题目中给出的secret(被猜测数字)和guess(猜测的数字)长度一定是一样的。

4、解题方法1

做这道题还需要注意,一般的猜数字游戏中,被猜的数字有四个且互不相同,但在本题中,可以有任意多个数字,且数字有可能存在同一数字重复多次出现的情况。

一开始我想了一个比较笨的办法,即分别求出A和B的数量,暴力破解,Java代码如下:

/**
 * @功能说明:LeetCode 299 - Bulls and Cows
 * @开发人员:Tsybius2014
 * @开发时间:2015年10月31日
 */
public class Solution {
    
    /**
     * 猜数字
     * @param secret 原数字
     * @param guess 猜测数字
     * @return
     */
    public String getHint(String secret, String guess) {
        
        if (secret == null || guess == null || secret.length() != guess.length()) {
            return "";
        }
        
        int countA = 0;
        int countB = 0;
        
        char[] arrA = secret.toCharArray();
        char[] arrB = guess.toCharArray();
        
        //求A的数量
        for (int i = 0; i < arrA.length; i++) {
            for (int j = 0; j < arrB.length; j++) {
                if (arrA[i] == ‘ ‘ || arrB[j] == ‘ ‘) {
                    continue;
                } else if (arrA[i] == arrB[j]) {
                    if (i == j) {
                        countA++;
                        arrA[i] = ‘ ‘;
                        arrB[j] = ‘ ‘;
                    }
                }
            }
        }

        //求B的数量
        for (int i = 0; i < arrA.length; i++) {
            for (int j = 0; j < arrB.length; j++) {
                if (arrA[i] == ‘ ‘ || arrB[j] == ‘ ‘) {
                    continue;
                } else if (arrA[i] == arrB[j]) {
                    countB++;
                    arrA[i] = ‘ ‘;
                    arrB[j] = ‘ ‘;
                }
            }
        }
        
        return String.valueOf(countA) + "A" + String.valueOf(countB) + "B";
    }
}

5、解题方法2

后来我看了下讨论区,发现了一种更加高效的方法。这个方法的大致思路是,创建一个包含10个元素的数组,分别用于记录遇到的每个数字的情况。这个方法只需要遍历一次数组。

Java代码如下:

/**
 * @功能说明:LeetCode 299 - Bulls and Cows
 * @开发人员:Tsybius2014
 * @开发时间:2015年10月31日
 */
public class Solution {
    
    /**
     * 猜数字
     * @param secret 原数字
     * @param guess 猜测数字
     * @return
     */
    public String getHint(String secret, String guess) {
        
        if (secret == null || guess == null || secret.length() != guess.length()) {
            return "";
        }
        
        int countA = 0;
        int countB = 0;
        int[] count = new int[10];
        
        for (int i = 0; i < secret.length(); i++) {
            if (secret.charAt(i) == guess.charAt(i)) {
                countA++;
            } else {
                count[secret.charAt(i) - ‘0‘]++;
                if (count[secret.charAt(i) - ‘0‘] <= 0) {
                    countB++;
                }
                count[guess.charAt(i)- ‘0‘]--;
                if (count[guess.charAt(i)- ‘0‘] >= 0) {
                    countB++;
                }
            }
        }
        
        return String.valueOf(countA) + "A" + String.valueOf(countB) + "B";
    }
}

END

时间: 2024-12-23 04:34:10

LeetCode:Bulls and Cows - 猜数字游戏的相关文章

[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 corr

JavaScript一个猜数字游戏

效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载入的时候就开始一个新的游戏 window.onpopstate = popState; //处理历史记录相关事件 var state,ui; //全局变量,在newgame()方法中会对其初始化 function newgame( playagin ){ //开始一个新的猜数字游戏 //初始化一个包含需要的文

猜数字游戏及rand()函数

#include<stdio.h>#include<stdlib.h>int main() { short number; short guess=0; number=rand()%100; number++; printf("猜数字游戏\n"); printf("该数字在1到100之间\n"); while(guess!=number) { printf("请你输入所猜数字:"); scanf("%hd&quo

原创Android游戏--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用

--------------------------------------------------------------- V0.1版本 上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添加的功能,以及一些可改进的地方,于是准备继续完善此游戏,顺便学Android了. 本次更新信息如下: 1.改正了随机数生成算法,更正了不能产生数字'9'的bug 2.增加了数据存储与IO的内容,使用了SharedPreferences保存数据 3.保存数据为: 总盘数,猜中的盘数 4.使用了Simp

*循环-20. 猜数字游戏

1 /* 2 * Main.c 3 * C20-循环-20. 猜数字游戏 4 * Created on: 2014年8月18日 5 * Author: Boomkeeper 6 *********测试部分通过********* 7 */ 8 9 #include <stdio.h> 10 11 int main(void){ 12 13 int random = 0,N = 0;//系统输入的随机数和最大猜测次数 14 int in = 0;//每次输入的猜测 15 int count = 0

猜数字 游戏

前几天一直做的一个小游戏,猜数字游戏,开始不会做,通过老师的帮助还是成功做出来了,也算小有成就了,嘿嘿. 下面给大家看看我做的这个小游戏: public class GuessNumber { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("\t****** 猜数字 ******\n"); System.out.println("

Python实现简单的猜数字游戏

Python实现简单的猜数字游戏,具体如下: 随机生成一个1-10之间的数字,让用户来猜,当猜错时,会提示猜的数字是大还是小了,直到用户猜对为止. import random secret = random.randint(1,10) #print(secret) print('------猜数字游戏!-----') guess = 0 while guess != secret: temp = input('猜数字游戏开始,请输入数字:') guess = int(temp) if guess

猜数字游戏

功能:产生一个随机数,猜随机数的大小,机会只有3次,并且如果猜错了,焦点自动返回.使用到的接口:ActionListener FocusListener; 代码: package com.niit.guessgame; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.

猜数字游戏代码

#include <iostream> #include <cstdlib> #include <conio.h> #include <ctime> using namespace std; //清屏 void ClearScreen() { system("cls"); } //显示菜单 void ViewMenu() { cout<<"******************"<<endl; c