如何用递归检查嵌套数组中某个数字的出现次数是否等于指定次数
递归统计嵌套数组中目标数字的出现次数是否等于指定次数
我需要实现一个递归函数,判断未知嵌套层数的数组中目标数字N的出现次数是否恰好等于K。以下是我编写的代码和测试用例,但运行结果不符合预期:
现有代码
function doesNumAppearKTimes(arr, N, K, count = 0) { for(let i = 0;i<arr.length; i++) { if(Array.isArray(arr[i])) { doesNumAppearKTimes(arr[i],N,K,count) } else if(arr[i] === N) { count++ } } return count === K; }
测试用例
console.log(doesNumAppearKTimes([1,2,[3,4,[5],6],3,7],3,3)); // 预期输出: false(实际3出现2次) console.log(doesNumAppearKTimes([[0,-8,1,[-2,2]],[11,[4],6],2,2],2,3)); // 预期输出: true(2出现3次) console.log(doesNumAppearKTimes([10,21,4,9,3,7,4,1],4,1)); // 预期输出: false(4出现2次)
问题根源
你的代码核心问题在于count参数的传递逻辑:JavaScript中基本类型是按值传递的,递归调用doesNumAppearKTimes(arr[i],N,K,count)时,内层函数的count是外层count的副本,内层对count的修改不会同步到外层。这导致最终统计的count只计算了最外层数组中N的出现次数,嵌套数组里的N完全没被统计进去。
修复方案
这里提供两种可行的修复思路:
思路1:让递归子函数返回统计次数
每次处理子数组时,将递归返回的次数累加到当前层级的count中:
function doesNumAppearKTimes(arr, N, K) { function countOccurrences(arr) { let count = 0; for (const item of arr) { if (Array.isArray(item)) { count += countOccurrences(item); } else if (item === N) { count++; } } return count; } return countOccurrences(arr) === K; }
思路2:用引用类型传递计数器
利用对象按引用传递的特性,修改对象属性时会同步到所有引用位置:
function doesNumAppearKTimes(arr, N, K) { const counter = { count: 0 }; function traverse(arr) { for (const item of arr) { if (Array.isArray(item)) { traverse(item); } else if (item === N) { counter.count++; } } } traverse(arr); return counter.count === K; }
验证结果
替换修复后的代码后,所有测试用例都会输出符合预期的结果:
- 第一个测试用例中3出现2次,返回
false - 第二个测试用例中2出现3次,返回
true - 第三个测试用例中4出现2次,返回
false
内容的提问来源于stack exchange,提问作者kingdin
相关产品推荐
相关产品推荐

