首先分组最大的规律是求最大公约数
求最大公约数的方法
// 求最大公约数
let gys = (a, b) => {
if (b === 0) {
return a
}
return gys(b, a % b)
}
// console.log(gys(2, 4))
// console.log(gys(8, 4))
判断结果的函数:
function getResult(arr) {
//卡牌排序是为了让相同的卡牌排在一起---[1,2,1,2]=>1122
let str = arr.sort().join('')
// 分组--正则((\d)\1+=>表示多个相同的数值)---多个相同的数字或者单个数字
let group = str.match(/(\d)\1+|\d/g)
// console.log(group)
// 先求出两组的最大公约数,再和第三组求最大公约数,以此类推,直到把所有的公约数求完
while (group.length>1) {
let a = group.shift().length;
let b = group.shift().length;
//求出a,b的公约数
let v = gys(a, b)
if (v === 1) {
return false
}else {
// 把上次删掉的放回去--因为关注的是长度,所以随便写个0或其他单个数字就行了
group.unshift('0'.repeat(v))
}
}
// 边界
return group.length?group[0].length>1:false
}
console.log(getResult([1,2,3,4,4,3,2,1]))//true
console.log(getResult([1,1,1,2,2,2,3,3]))//true
console.log(getResult([1,1]))//true
console.log(getResult([1]))//false