You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中实现仅返回数组中一组模式的函数?

如何实现JavaScript函数findPattern(arr)查找数组中的数字模式并仅返回一次?

我希望实现一个JavaScript函数findPattern(arr),用于查找并返回数组中的数字模式,但仅返回该模式一次。示例如下:

示例1:findPattern([1, 2, 3, 4, 5]) 应返回 [1],而非 [1,1,1,1];
示例2:findPattern([1, 5, 4, 8, 7, 11, 10, 14, 13]) 应返回 [4, -1],而非 [4, -1, 4, -1, 4, -1, 4, -1];
示例3:findPattern([1, 5, 2, 3, 1, 5, 2, 3, 1]) 应返回 [4, -3, 1, -2],而非 [4, -3, 1, -2, 4, -3, 1, -2]。

请问有什么简洁的实现方式?


解决方案

要解决这个问题,核心思路是先计算数组的相邻元素差值序列,然后在这个差值序列中找到最短的重复子单元——这个子单元就是我们要返回的模式。下面是具体实现:

function findPattern(arr) {
  // 处理数组长度不足2的边界情况
  if (arr.length < 2) return arr.slice(0, 1);
  
  // 生成相邻元素的差值序列
  const diffs = arr.slice(1).map((current, index) => current - arr[index]);
  
  // 从最短的可能模式长度开始遍历检查
  for (let patternLen = 1; patternLen <= diffs.length / 2; patternLen++) {
    // 验证当前长度的子序列是否能完全重复覆盖整个差值序列
    const isValidPattern = diffs.every((val, idx) => val === diffs[idx % patternLen]);
    if (isValidPattern) {
      return diffs.slice(0, patternLen);
    }
  }
  
  // 如果没有找到重复模式,返回完整的差值序列
  return diffs;
}

代码说明

  1. 差值序列生成:通过slice(1)获取原数组从第二个元素开始的子数组,再用map计算每个元素与前一个元素的差值,得到差值序列。
  2. 模式查找逻辑:从长度为1的子序列开始检查,逐步增加长度,直到找到能完全匹配整个差值序列的重复单元。用every方法验证每个位置的差值是否和模式对应位置的差值一致(通过idx % patternLen循环取模式的索引)。
  3. 边界处理:当数组长度小于2时,直接返回第一个元素(符合示例1的逻辑)。

测试验证

用你给出的示例测试:

  • findPattern([1,2,3,4,5]) → 差值序列为[1,1,1,1],长度1的模式匹配,返回[1],符合预期。
  • findPattern([1,5,4,8,7,11,10,14,13]) → 差值序列为[4,-1,4,-1,4,-1,4,-1],长度2的模式匹配,返回[4,-1],符合预期。
  • findPattern([1,5,2,3,1,5,2,3,1]) → 差值序列为[4,-3,1,-2,4,-3,1,-2],长度4的模式匹配,返回[4,-3,1,-2],符合预期。

内容的提问来源于stack exchange,提问作者Jonathan Edmund

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:01:27