珠玑妙算

咱们如今有四个槽,每一个槽放一个球,颜色多是红色(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;

    }

相关文章
相关标签/搜索