JavaScript找到数组最多连续出现的数和出现的个数

392 阅读1分钟

JavaScript找到数组最多连续出现的数和出现的个数

思路:

  • 创建一个类,在实例化的时候将目标数组传入,constructor中把传入的数组赋值给this.arr,在类中方便使用。
  • 在这个类中有两个方法
    • count函数:
      • 将目标数组转为字符串,用正则匹配出目标元素得到一个数组
      • 遍历得到的数组,通过比较元素length来找出目标在数组中最多连续出现的次数,length最大的就是了。
    • find函数:
      • 将目标数组去重后得到一个新数组(这里是一个小优化,避免值一样的元素重复查找,减少不必要的循环遍历),
      • 在遍历新数组过程中调用count函数得到当前元素出现的次数
      • 通过if条件判断当前元素出现的次数now如果比上一个元素出现次数prev少,直接跳过当前循环,
      • 否则将当前元素出现的次数now赋值给prev(记录上一个元素出现次数的变量),并且将当前元素和它出现的次数记录在obj对象中,当遍历结束后,find函数返回obj对象。

代码:

const testArr = [1, 2, 3, 3, 2, 2, 2, 3, 3, 3, 3, 5, 3, 3, 3]
class MyArray {
  constructor(arr) {
    this.arr = arr
  }
  count(c) {
    let reg = new RegExp(c + '+', 'g'),
      t = this.arr.join('').match(reg),
      m = 0
    for (let i = 0, j = t.length; i < j; i++) {
      m = Math.max(t[i].length, m)
    }
    return m
  }
  find() {
    let newArr = [...new Set(this.arr)]
    let prev = 0
    let obj = {}
    for (let i = 0; i < newArr.length; i++) {
      const item = newArr[i]
      let now = this.count(item)
      if (now < prev) continue
      prev = now
      obj.count = now
      obj.value = item
    }
    return obj
  }
}
const res = new MyArray(testArr).find()
console.log(res) // { count: 4, value: 3 }