【问题标题】:How to check if array elements match some pattern (eg:XXXXYY)?如何检查数组元素是否匹配某些模式(例如:XXXXYY)?
【发布时间】:2018-09-26 09:22:29
【问题描述】:

例如,我有数组:

[1,2,3,2,2,2,1,2,3]

,它与 XXXXYY 模式匹配,因为它(至少)有四个“2”和两个“1”,但我的问题是,如何检查数组是否匹配这种模式?我试过了:

const arr=[1,2,3,2,2,2,1,3,2];
const pattern=[4,2];
let m=new Map();
for(const num of arr){
  if(!m[num]){
    m[num]=0;
  }
  m[num]++;
}

let i=0;
let isMatch=true;
for(const key in m){
  if(m[key]<pattern[i]){
    isMatch=false;
  }
  i++;
}
console.log(isMatch);

但是 isMatch 是假的。有没有更简单的方法可以做到这一点?

【问题讨论】:

  • 更简单?您的意思是“正确”-因为您的方法存在根本缺陷 m 将是 1:2, 2:4, 3:2 - 所以您的 for 循环为 m[key]... 得到 2, 4, 2... 因为 2= 模式中的值
  • 所以,这个问题说明了是否有n 不同种类的元素具有预期的频率。如果是,那么给定的模式是可能的。

标签: javascript arrays algorithm


【解决方案1】:

您可以对这些值进行计数,然后获取排序后的计数并检查排序模式。

var DESC = (a, b) => b - a,
    array = [1, 2, 3, 2, 2, 2, 1, 3, 2],
    pattern = [4, 2],
    count = Array
        .from(array.reduce((m, v) => m.set(v, (m.get(v) || 0) + 1), new Map).values())
        .sort(DESC),
    check = pattern
        .sort(DESC)
        .every((c, i) => count[i] >= c);
    
console.log(check);        
console.log(count);

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 2017-05-23
    • 2010-10-20
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多