题目:
给定一副牌,每张牌上都写着一个整数
此时,你需要选定一个数字 x,使我们可以将整幅牌按下述规则分成1组或更多组:
- 每组都有x张牌
- 组内所有的牌上都写着相同的整数
仅当你可选的 x>=2时,返回true
参考示例:
思路:
当最小的分组的长度,是这个分组的长度的最小值和其他的数字的长度是整数倍的关系即满足
代码:
<script>
const hasGroupsSizeX = arr => {
arr.sort((a, b) => a - b); //排序
//记录分出来的组的最小的长度
let min = Number.MAX_SAFE_INTEGER;
let dst = []; //记录每个分组
let result = true;
//遍历
//生成一个临时变量-->tmp[],用来保存当前分组的所有元素
for (let i = 0, len = arr.length, tmp = []; i < len; i++) {
tmp.push(arr[i]); //存储
//判断当前元素的下一个元素是不是跟arr[i]是一组的
for (let j = i + 1; j < len - 1; j++) {
if (arr[i] === arr[j]) {
tmp.push(arr[j]);
} else {
if (min > tmp.length) {
min = tmp.length;
}
//注意:数组是引用类型,如果将dst直接push tmp,那么最终的结果会出错
dst.push([].concat(tmp));
tmp.length = 0; //清空临时数组
i = j; //为了让i从当前不符合的这一项开始向后继续
break;
}
}
}
//检验:这个分组的长度的最小值和其他的数字的长度是整数倍的关系
//every() 方法用于检测数组所有元素是否都符合指定条件
//这里不用forEach的原因是forEach不支持跳出,也就是不支持for循环的break的功能
dst.every(item => {
if (item.length % min !== 0) {
result = false;
return false;
}
})
return result;
}
</script>