LeetCode:Bulls and Cows - 猜數字遊戲

一、題目名稱java

Bulls and Cows(猜數字遊戲)git

二、題目地址數組

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

三、題目內容遊戲

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

中文:假設你正在玩猜數字遊戲(Bulls and Cows):你寫出4個數字讓你的朋友猜,每次你的朋友猜一個數字,你給出一條線索,這個線索告訴你的朋友,有多少個數字位置是正確的(被稱爲Bulls),有多少個數字位置是不正確的(被稱爲Cows),你的朋友須要根據這些線索最終猜出正確的數字。開發

例如,給出的數字是1807,你的朋友猜的是7810,這裏用A表明Bulls,B表明Cows,則給出的線索是1A3B。get

題目中給出的secret(被猜想數字)和guess(猜想的數字)長度必定是同樣的。it

四、解題方法1io

作這道題還須要注意,通常的猜數字遊戲中,被猜的數字有四個且互不相同,但在本題中,能夠有任意多個數字,且數字有可能存在同一數字重複屢次出現的狀況。

一開始我想了一個比較笨的辦法,即分別求出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";
    }
}

五、解題方法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

相關文章
相關標籤/搜索