珠璣妙算

咱們如今有四個槽,每一個槽放一個球,顏色多是紅色(R)、黃色(Y)、綠色(G)或藍色(B)。例如,可能的狀況爲RGGB(槽1爲紅色,槽二、3爲綠色,槽4爲藍色),做爲玩家,你須要試圖猜出顏色的組合。好比,你可能猜YRGB。要是你猜對了某個槽的顏色,則算一次「猜中」。要是隻是猜對了顏色但槽位猜錯了,則算一次「僞猜中」。注意,「猜中」不能算入「僞猜中」。java

給定兩個string Aguess。分別表示顏色組合,和一個猜想。請返回一個int數組,第一個元素爲猜中的次數,第二個元素爲僞猜中的次數。數組

測試樣例:測試

"RGBY","GGRR"
返回:[1,1]

從題目中能夠獲取隱含信息:
「猜中」 屬於 「僞猜中」,可是反過來不成立。

全部須要先統計猜中,
而後再統計 僞猜中個數= 可能的僞猜中個數 - 猜中個數

所以代碼就比較容易寫出來spa

1code

2ci

3字符串

4get

5string

6hash

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

import java.util.*;

 

public class Result {

    public int[] calcResult(String A, String guess) {

        if (A == null || guess == null) {

            return new int[] { 0, 0 };

        }

        // right 表示猜中

        // unright 表示僞猜中

        int right=0,unright=0;

        // 保存A中的<字符,字符個數>

        HashMap<Character, Integer> map = new HashMap<>();

         

        for (int i = 0; i < A.length(); ++i){

            // 統計猜中

            if(A.charAt(i) == guess.charAt(i))

                ++right;

             

            // 獲取A中的<字符,字符個數>

            Integer val = map.get(A.charAt(i));

            if(val==null){

                val=1;

            }else{

                val++;

            }

            map.put(A.charAt(i), val);

        }

         

        // 統計僞猜中的個數(猜中也屬於僞猜中)

        for(int i=0;i<guess.length();++i){

            Integer val = map.get(guess.charAt(i));

            if(val != null && val >0){

                unright++;

                val--;

                if(val<0)

                    val=0;

                map.put(guess.charAt(i), val);

            }

        }

        // 從僞猜中當中,去除猜中個數

        unright -=right;

        if(unright<0)unright = 0;

        return new int[] { right, unright };

    }

}

 

或者

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

public int[] calcResult(String A, String guess) {

    // write code here

    /*

     * 依次比對A和guess,若是位置和字符都相同,則計入依次猜中,若是不一樣則添加到hash中

     * 所有結束後觀察兩組hash中是否有計數非0的相同字符,有則將二者中較小值計入僞猜中

     */

    int[] res = new int[2];

    if(A == null || guess == null || A.length() != guess.length()){

        return null;

    }

    int len = A.length();

    int[] hashA = new int[256];

    int[] hashG = new int[256];

    for(int i = 0; i < len; i++){

        if(A.charAt(i) == guess.charAt(i)){

            res[0]++;

        }else{

            hashA[A.charAt(i)]++;

            hashG[guess.charAt(i)]++;

        }

    }

    for(int i = 0; i < 256; i++){

        if(hashA[i] > 0 && hashG[i] > 0){

            res[1] += Math.min(hashA[i], hashG[i]);

        }

    }

    return res;

}

 

 

1

Solution:  兩個字符串逐個比較字符相同爲猜中。咱們把全部不猜中的字符分別作一個統計,而後計算A和guess不相同的字符數去較小值,加起來就是僞猜中的。 

public int[] calcResult(String A, String guess) {  

        int[] result=new int[2];

        if(A==null || guess==null || A.length()!=guess.length()) return result;               

        int same=0,count=0;

        int[] aCount=new int[26];

        int[] gCount=new int[26];

        //"RGBY","GGRR"  "BGGB","GGRR"

        for(int i=0;i<A.length();i++){

             if(A.charAt(i)==guess.charAt(i)){

                 same++;

             }else{

                 aCount[A.charAt(i)-'A']++;

                 gCount[guess.charAt(i)-'A']++;

             }

        }

        

       for(int i=0;i<26;i++){

           if(aCount[i]<gCount[i]){

               count+=aCount[i];

           }else{

               count+=gCount[i];

           }

       }   

        

        result[0]=same;

        result[1]=count;

        return result;

    }

相關文章
相關標籤/搜索