Find longest occurrence of same number in array

前端 未结 12 1503
一生所求
一生所求 2021-01-05 17:49

Using JavaScript, I\'m trying to find a way to find the longest occurrence of the same number (in this case, 1) in an array.

For instance, here\'s a sample array:

12条回答
  •  长发绾君心
    2021-01-05 18:04

    Input array:

    const seq = [
    0, 0, 0,
    1, 1, 1,
    1, 1, 1, 1, 1,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1,
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1,
    ];
    

    Shortest solutions:

    console.log(Math.max(...Array.from(seq.join("").matchAll(/(.)\1+/g), m=>m[0].length)))
    

    Alternative with regexp (spoiler: it's ~25%, slower than solution with reduce(). See "Modern approach with reduce()" below):

    const longestSeq = (seq) => {
        let max = 0;
        seq.join("").replace(/(.)\1+/g, m=> max = Math.max(max, m.length));
        return max;
    };
    

    Straightforward, old-school style, human readable and fastest solution:

    let longestSeq = () => {
        let maxCount = 0,
            curCount = 0,
            curItem, prevItem,
            l = seq.length+2, // +1+1 to finish last sequence and compare 'undefined' with previous
            i = 0;
        for (; i < l; ++i) {
          curItem = seq[i];
          if (curItem === prevItem) ++curCount;
          else {
            if (curCount > maxCount) maxCount = curCount;
            curCount = 1;
            prevItem = curItem;
          }
        }
        return maxCount;
    }
    

    Modern approach with reduce() (just very little slower than old-school code above):

    const longestSeq = (seq) => seq
        .reduce(
            ({count, max}, item) => item === 0
            ? { count: ++count, max: Math.max(count, max) }
            : { count: 0, max: max },
          { count: 0, max: 0} )
        .max;
    

    Performance test, Reduce() vs old-school for(): https://jsbench.me/ifkgsin56z/1

提交回复
热议问题