如何判断少量数组元素是否存在于多数组中?JS中奖组合高效判断问询
高效解决数组元素匹配的两个场景问题
嘿,针对你提到的两个数组匹配需求,我来分享几个实用且高效的实现思路,尤其是第二个彩票中奖判定的场景,我们可以通过预处理技巧大幅提升对比效率。
一、判断少量数组元素是否存在于多个目标数组的任意一个内
首先得明确两种常见的“存在”场景,我分别给出对应的高效解法:
场景1:少量元素的全部都在某一个目标数组中
比如你有一个小数组checkArr = [1,5,9],和多个目标数组targets = [[1,2,3], [4,5,6], [1,5,9], ...],要判断是否有一个目标数组完全包含checkArr的所有元素:
- 核心优化点:把每个目标数组转换成Set(Set的
has()方法是O(1)时间复杂度,比数组的includes()快得多),再逐一检查小数组的元素是否都在某个目标Set里。 - JavaScript代码示例:
function isAllElementsInAnyTarget(checkArr, targetArrays) { // 提前把所有目标数组转成Set,一次预处理后多次查询更高效 const targetSets = targetArrays.map(arr => new Set(arr)); for (const set of targetSets) { let allMatch = true; for (const elem of checkArr) { if (!set.has(elem)) { allMatch = false; break; } } if (allMatch) return true; } return false; }
场景2:少量元素中至少有一个在任意目标数组中
这种场景更简单,直接把所有目标数组的元素合并成一个大Set,再检查少量元素是否有至少一个在这个Set里:
function isAnyElementInTargets(checkArr, targetArrays) { const allTargetElements = new Set(targetArrays.flat()); return checkArr.some(elem => allTargetElements.has(elem)); }
二、JavaScript场景:玩家数字匹配中奖组合判定
你的需求是:当玩家的数字数组中存在3个元素,与中奖组合里的某一子数组完全匹配(元素一致,不考虑顺序)时,判定玩家中奖。比如player1Cells = [1,3,5,7,9]匹配中奖组合[1,5,9],即可中奖。
高效实现思路
如果每次都遍历中奖组合和玩家数组逐一对比,当中奖组合数量较多时会很慢。我们可以通过预处理中奖组合+生成玩家子集对比的方式优化:
- 预处理中奖组合:把每个中奖子数组转换成排序后的字符串(比如
[1,5,9]转成"1,5,9"),存到一个Set里——这样后续查询时,只需要生成玩家数组的3元素子集的排序字符串,就能以O(1)的速度判断是否匹配。 - 生成玩家数组的所有3元素子集,转成排序字符串后和预处理的Set对比。
代码实现
// 第一步:预处理中奖组合(一次性操作) const winningCombos = [[1,2,3], [4,5,6], [7,8,9], [1,5,9], [3,5,7]]; const winningComboStrings = new Set( winningCombos.map(combo => combo.sort((a,b) => a-b).join(',')) ); // 第二步:判断玩家是否中奖的函数 function hasWinningCombo(playerCells) { const cellCount = playerCells.length; // 玩家数字不足3个直接排除 if (cellCount < 3) return false; // 生成所有可能的3元素组合 for (let i = 0; i < cellCount - 2; i++) { for (let j = i + 1; j < cellCount - 1; j++) { for (let k = j + 1; k < cellCount; k++) { const combo = [playerCells[i], playerCells[j], playerCells[k]]; const comboStr = combo.sort((a,b) => a-b).join(','); if (winningComboStrings.has(comboStr)) { return true; } } } } return false; } // 测试示例 const player1Cells = [1,3,5,7,9]; const player2Cells = [2,4,6,8,10]; console.log(hasWinningCombo(player1Cells)); // true(匹配[1,5,9]或[3,5,7]) console.log(hasWinningCombo(player2Cells)); // false
进阶:需要严格匹配元素顺序的情况
如果要求玩家数组中的3个元素顺序和中奖子数组完全一致,只需要把预处理的字符串改成JSON序列化格式即可:
const winningComboStrings = new Set( winningCombos.map(combo => JSON.stringify(combo)) ); function hasWinningComboWithOrder(playerCells) { const cellCount = playerCells.length; if (cellCount < 3) return false; for (let i = 0; i < cellCount - 2; i++) { for (let j = i + 1; j < cellCount - 1; j++) { for (let k = j + 1; k < cellCount; k++) { const combo = [playerCells[i], playerCells[j], playerCells[k]]; const comboStr = JSON.stringify(combo); if (winningComboStrings.has(comboStr)) { return true; } } } } return false; }
内容的提问来源于stack exchange,提问作者Angelo
相关产品推荐
相关产品推荐

