这道题我认为是一道很经典的题目,能理解这个解题思路之后,就会有一种豁然开朗的感觉,让我们一起康康叭~
先来对题意分析一波:
公牛:位置和数字都对应的上
解法:secret[i]=guess[i]
母牛:除了公牛之外,有相同数字的对数,(’11‘,‘11’这是两对哦🎅)
解法思路:
看下面这个好对比吗?不好对比,我们稍稍调整一下
这样再看是不是就一目了然了,只需要对比相同索引下secret[i]和guess[i]
取secret[i]和guess[i]最小值,Math.min(arrSecret[i],arrGuess[i]),为什么取最小值?
见下图:
secret中有2个1,arrGuess中有3个1,那满足母牛条件的(有几对相同数字的)有2对,所以取最小值。
现在来看下代码
var getHint = function (secret, guess) {
var x = 0;
var y = 0;
//创建两个数组,每个数组都有从10个元素,全是0(为了记录从0-9元素出现的次数)
var arrSecret = new Array(10).fill(0);
var arrGuess = new Array(10).fill(0);
for (var i = 0; i <= secret.length - 1; i++) {
//位置和数字都对应的上,累加得到公牛个数
if (secret[i] === guess[i]) {
++x;
} else {
//数字出现的次数,相当于就是索引出现的次数
++arrSecret[secret[i]];
++arrGuess[guess[i]];
}
}
//取最小值,累加为母牛个数
for (var i = 0; i <= 9; i++) {
y += Math.min(arrSecret[i], arrGuess[i]);
}
//字符串拼接,直接+即可
return x + 'A' + y + 'B';
};