珠玑妙算
难度:
标签:
题目描述
The Game of Master Mind is played as follows:
The computer has four slots, and each slot will contain a ball that is red (R). yellow (Y). green (G) or blue (B). For example, the computer might have RGGB (Slot #1 is red, Slots #2 and #3 are green, Slot #4 is blue).
You, the user, are trying to guess the solution. You might, for example, guess YRGB.
When you guess the correct color for the correct slot, you get a "hit:' If you guess a color that exists but is in the wrong slot, you get a "pseudo-hit:' Note that a slot that is a hit can never count as a pseudo-hit.
For example, if the actual solution is RGBY and you guess GGRR, you have one hit and one pseudo-hit. Write a method that, given a guess and a solution, returns the number of hits and pseudo-hits.
Given a sequence of colors solution
, and a guess
, write a method that return the number of hits and pseudo-hit answer
, where answer[0]
is the number of hits and answer[1]
is the number of pseudo-hit.
Example:
Input: solution="RGBY",guess="GGRR" Output: [1,1] Explanation: hit once, pseudo-hit once.
Note:
len(solution) = len(guess) = 4
- There are only
"R"
,"G"
,"B"
,"Y"
insolution
andguess
.
代码结果
运行时间: 24 ms, 内存: 16.5 MB
// 思路:
// 1. 使用 Java Stream API 计算猜中和伪猜中的次数。
// 2. 使用 IntStream 对 solution 和 guess 进行遍历,计算命中的数量。
// 3. 使用 groupingBy 计算各颜色出现的次数,统计伪猜中的数量。
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class MasterMindStream {
public int[] masterMind(String solution, String guess) {
int hit = (int) IntStream.range(0, solution.length())
.filter(i -> solution.charAt(i) == guess.charAt(i))
.count();
Map<Character, Long> solutionMap = IntStream.range(0, solution.length())
.mapToObj(i -> solution.charAt(i))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Map<Character, Long> guessMap = IntStream.range(0, guess.length())
.mapToObj(i -> guess.charAt(i))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
int pseudoHit = solutionMap.keySet().stream()
.mapToInt(k -> Math.min(solutionMap.getOrDefault(k, 0L), guessMap.getOrDefault(k, 0L)).intValue())
.sum() - hit;
return new int[]{hit, pseudoHit};
}
}
解释
方法:
时间复杂度:
空间复杂度: