掌握JavaScript问题解决的前3个模式
#javascript #编程 #算法 #dsa

介绍

作为JavaScript开发人员,有效解决问题的技术对于克服挑战和编写有效的代码至关重要。在本文中,我们将探索一系列针对JavaScript的量身定制的解决问题的技术。
无论您是初学者还是经验丰富的开发人员,这些技术不仅对您的日常编码有价值,而且对访谈和技术评估非常有益。让我们潜入并发现将提升您的JavaScript问题解决游戏的策略。


1.频率计数器

频率计数器技术是解决问题的强大方法,涉及分析数组中元素的频率。一个常见的情况是,当我们需要确定给定数组中每个元素出现多少次时。为了说明这一技术,让我们考虑一些问题及其解决方案。

问题1:检查元素的频率
编写一个函数checkFrequency来检查数组中每个元素的频率;

解决方案:

const checkFrequency = (nums) => {
  const frequencyMap = {};
  nums.forEach((num) => {
    frequencyMap[num] = frequencyMap[num] + 1 || 1;
  });
  return frequencyMap;
}

const result = checkFrequency([1, 2, 2, 1, 3, 4, 3, 4, 1]);
console.log(result); // {1: 3, 2: 2, 3: 2, 4: 2}

问题2:匹配正方形
编写一个称为squared的函数,该函数接受两个数组。如果数组中的每个值都具有相应的值平方,则该函数应返回true。数字的频率应相同。

解决方案:

const squared = (array1, array2) => {
  if(array1.length !== array2.length) return false;

  const array1Frequency = {};
  const array2Frequency = {};

  array2.forEach((num) => {
    array2Frequency[num] = array2Frequency[num] + 1 || 1;
  });

  array1.forEach((num) => {
    array1Frequency[num] = array1Frequency[num] + 1 || 1;
  });

  return array1.every((num) => {
    return array2Frequency[num*num] === array1Frequency[num];
  });
};

const result = squared([2, 3, 4, 2], [9, 16, 4]);
console.log(result); // false

2. Mulitple指针

多个指针技术是解决涉及搜索,比较或遍历数组中元素的问题的宝贵方法。通过利用两个或多个以不同方向移动或以不同速度移动的指针,我们可以缩小搜索空间并找到提高时间复杂性的解决方案。
让我们检查一个特定的问题及其解决方案,以了解如何在JavaScript中应用此技术。

问题1:找到零和零>
的配对 写一个函数sumZero以在给定数组的总和为零的给定数组中找到一对数字。

解决方案:

const sumZero = (nums) => {
  let left = 0, right = nums.length - 1;

  while(left < right) {
    const sum = nums[left] + nums[right];
    if(sum === 0) {
      return [nums[left], nums[right]];
    } else if(sum > 0) {
      right--;
    } else {
      left++;
    }
  } 
}

const result = sumZero([-3, -2, -1, 0, 1, 2, 3, 10]);
console.log(result); // [-3, 3]

问题2:计数唯一数字
编写一个函数以返回数字排序数组中存在的唯一数字的数量。

解决方案:

const uniqueNumbers = (nums) => {
  if(!nums.length) return 0;

  let left = 0, right = 1;
  let count = 1;

  while(right < nums.length) {
    if(nums[left] === nums[right]) {
      right++;
    } else if(nums[left] !== nums[right]) {
      count++;
      left = right;
      right++;
    }
  }

  return count;
};

const result = uniqueNumbers([1, 2, 2, 3, 3, 3, 4, 4, 5]);
console.log(result); // 5

3.滑动窗口

滑动窗口技术是一种强大的策略,用于解决涉及在较大数组中找到子集或子阵列的问题。
通过维护动态窗口并将其滑入整个数组,我们可以有效地计算固定长度子阵列的总和,平均值或其他指标。

问题1:找到最大的连续数字
编写一个可以接受整数和数字n的函数。该函数应计算n连续数的最大总和。

解决方案:

const getLargestSum = (arr, num) => {
  if(arr.length < num) return null;

  let largestSum = arr.slice(0, num).reduce((a, b) => a+b);
  let lastWindowSum = largestSum;

  for(let i = 0; i < arr.length - num+1; i++) {
    lastWindowSum = lastWindowSum - arr[i] + arr[i+num];

    if(largestSum < lastWindowSum) {
      largestSum = lastWindowSum;
    }
  }
  return largestSum;
};


const result = getLargestSum([1, 2, 1, 0, 0, 3, 2], 3);
console.log(result); // 5

结论

在本文中,我们介绍了三种强大的策略:频率计数器多个指针滑动窗口技术。这些技术提供了有价值的工具来有效地解决广泛的问题。

通过在JavaScript中掌握这些解决问题的技术,您将采用多功能方法来应对复杂的编程挑战。当您遇到不同的问题时,这些技术将是分析,分解和设计有效解决方案的宝贵工具。

请注意,本文提供的解决方案代表了实施技术的一种方法。如果您有替代或更有效的方法来解决所讨论的任何问题,我建议您在下面的评论部分中分享它们。


其他资源

  1. Udemy Course
  2. Multiple Pointers Problems
  3. Sliding Window Problems