freeCodeCamp/guide/chinese/certifications/javascript-algorithms-and-d.../basic-algorithm-scripting/chunky-monkey/index.md

10 KiB
Raw Blame History

title localeTitle
Chunky Monkey 矮胖的猴子

:triangular_flag_on_post:如果卡住,请记得使用**Read-Search-Ask** 。尝试配对程序:busts_in_silhouette:并编写自己的代码:pencil:

:checkered_flag:问题说明:

我们对此算法的目标是将arr (第一个参数)拆分为较小的数组块,其长度由size 第二个参数提供。我们的代码需要传递4个绿色检查目标才能完成此算法

  1. (['a', 'b', 'c', 'd'], 2)预期为[['a', 'b'], ['c', 'd']]
  2. ([0, 1, 2, 3, 4, 5], 3)预计[[0, 1, 2], [3, 4, 5]]
  3. ([0, 1, 2, 3, 4, 5], 2)预计[[0, 1], [2, 3], [4, 5]]
  4. ([0, 1, 2, 3, 4, 5], 4)预计[[0, 1, 2, 3], [4, 5]]

相关链接

:speech_balloon:提示1

上面的链接建议使用Array.push() ,所以让我们首先创建一个新的数组来存储我们很快会有这样的小数组:

    var newArray = []; 

现在尝试解决问题

:speech_balloon:提示2

接下来我们需要一个for loop来遍历arr

现在尝试解决问题

:speech_balloon:提示3

最后,我们需要一个方法来进行实际的拆分,我们可以使用Array.slice()来做到这一点。这个算法的关键是理解for loop size Array.slice()Array.push()是如何一起工作的。

现在尝试解决问题

扰流警报!

警告牌

提前解决!

:beginner:基本代码解决方案

    function chunkArrayInGroups(arr, size) { 
 
      var temp = []; 
      var result = []; 
 
      for (var a = 0; a < arr.length; a++) { 
        if (a % size !== size - 1) 
          temp.push(arr[a]); 
        else { 
          temp.push(arr[a]); 
          result.push(temp); 
          temp = []; 
        } 
      } 
 
      if (temp.length !== 0) 
        result.push(temp); 
      return result; 
    } 

:rocket: 运行代码

代码说明:

  • 首先,我们创建了两个名为tempresult空数组,我们最终会返回它们。
  • 我们的for循环循环直到a等于或大于我们测试中数组的长度。
  • 在我们的循环中,我们使用temp.push(arr[a]);推送到temp temp.push(arr[a]);如果a / size的余数不等于size - 1
  • 否则,我们推送到temp ,将temp推送到result变量并将temp重置为空数组。
  • 接下来,如果temp不是空数组,我们将其推送到result
  • 最后,我们返回result的值。

相关链接

:sunflower:中级代码解决方案:

    function chunkArrayInGroups(arr, size) { 
      // Break it up. 
      var arr2 = []; 
      for (var i = 0; i < arr.length; i+=size) { 
        arr2.push(arr.slice(i , i+size)); 
      } 
      return arr2; 
    } 

:rocket: 运行代码

代码说明:

  • 首先,我们创建一个空数组arr2 ,我们将存储'chunk'。
  • for循环从零开始每次循环都按size递增,并在达到arr.length时停止。
  • 请注意此for循环不会循环遍历arr 。相反,我们使用循环生成数字,我们可以将其用作索引,以在正确的位置切割数组。
  • 在我们的循环中,我们使用arr.slice(i, i+size)创建每个块,并使用arr2.push()将此值添加到arr2
  • 最后,我们返回arr2的值。

相关链接

:rotating_light:高级代码解决方案

    function chunkArrayInGroups(arr, size) { 
      // Break it up. 
      var newArr = []; 
      var i = 0; 
 
      while (i < arr.length) { 
        newArr.push(arr.slice(i, i+size)); 
        i += size; 
      } 
      return newArr; 
    } 
    chunkArrayInGroups(["a", "b", "c", "d"], 2); 

:rocket: 运行代码

代码说明:

  • 首先,我们创建两个变量。 newArr是一个空数组,我们将推送到。我们还将i变量设置为零以便在我们的while循环中使用。

  • 我们的while循环循环直到i等于或大于我们测试中数组的长度。

  • 在我们的循环中,我们使用arr.slice(i, i+size)推送到newArr数组。它第一次循环,它看起来像:

    newArr.pusharr.slice1,1 + 2

  • 在我们推送到newArr ,我们将size的变量添加到i

  • 最后,我们返回newArr的值。

相关链接

:rotating_light:高级代码解决方案2

    function chunkArrayInGroups(arr, size) { 
      var newArr = []; 
      while (arr.length) { 
        newArr.push(arr.splice(0,size)); 
      } 
      return newArr; 
    } 

:rocket: 运行代码

代码说明:

  • 首先,我们创建一个变量。 newArr是一个空数组,我们将推送到。
  • 我们的while循环循环直到我们测试中数组的长度不为0。
  • 在我们的循环中,我们使用arr.splice(0, size)推送到newArr数组。
  • 对于while循环的每次迭代,它会从arr前面删除元素的size数量,并将它们作为数组推送到newArr
  • 最后,我们返回newArr的值。

相关链接

:rotating_light:高级代码解决方案3

    function chunkArrayInGroups(arr, size) { 
      if (arr.length <= size){ 
        return [arr]; 
      } 
      else { 
        return [arr.slice(0,size)].concat(chunkArrayInGroups(arr.slice(size),size)); 
      } 
    } 

:rocket: 运行代码

代码说明:

  • 嵌套返回小于size的数组。
  • 对于任何大于大小的数组,它都被分成两部分。第一个段嵌套并与第二个第二段连接,进行递归调用。

相关链接

:clipboard:捐款说明:

  • :warning: 请勿添加与任何现有解决方案类似的解决方案。如果您认为它**相似但更好** ,那么尝试合并(或替换)现有的类似解决方案。
  • 添加解决方案的说明。
  • 将解决方案分为以下类别之一 - 基本 中级高级:traffic_light:
  • 如果您添加了任何**相关的主要内容,**请仅添加您的用户名。 :warning: 不要 删除任何现有的用户名

看到:point_right: Wiki Challenge Solution Template供参考。