布莱恩F爱
向一位来自Portlandyobet英雄联盟的谷歌开发专家学习Angular、Web技术和Node.js。
广告 ·ultimatecourses.com
用终极课程学习Angular的正确方法

数组左旋转使用Javascript和Node.js

我已经为公共数组左旋转问题提供了一些示例解决方案。

如果你没有听说过hackerrank.com看看吧。它允许您使用各种编程语言来处理常见的挑战。数组左旋转挑战包括通过标准输入接受一些基本输入,使用输入执行数组左旋转,然后按预期输出结果。

以下是来自hackerrank的概述:

对一个大小数组的左旋转操作将数组的每个元素单元移到左边。例如,如果在数组上执行了2次左旋转[1,2,3,4,5],则数组将变为[3,4,5,1,2]

测试期望数组中每个元素的输出,每个元素之间用一个空格隔开。因此,使用上面的例子,预期输出为:3 4 5 1 2

你可以下载源代码,然后继续,或者在GitHub上派生存储库:

输入

我采取的第一步是创建一个简单的文本文件,表示给定的输入:

5 4 1 2 3 4 5

我将其保存到一个名为data.txt

然后我写了一些代码使用Node.js读取和解析数据:

/ /全局变量n=0;d=0;数据=(];/ /读取标准输入过程stdinsetEncoding(“use utf8”);过程stdin的简历();/ /存储输入输入=;过程stdin(“数据”,函数(数据){输入+ =数据;});过程stdin(“结束”,函数(){linesOfInput=输入分裂(' \ n ');临时=linesOfInput(0]分裂(' ');临时地图(数量);n=临时(0];d=临时(1];数据=linesOfInput(1]分裂(' ');主要();});/ /让我们做函数主要(){/ /验证值如果(n< =0||d< =0||数据长度>n||数据长度<d){错误(“输入值无效。”);}/ /得到结果//这是左移位后的新数组结果=getResult();/ /输出结果过程stdout(结果加入(' '));}

首先,我定义一些全局可用的变量:

  • n=整数的数目
  • d=班次的数目
  • 数据=输入数组

接下来,我从标准输入中读取数据。当我们读取完标准输入流后,我解析数据以设置值n,d数据。最后,调用main ()函数,我们走了。

第一:循环

我采用的第一种方法是使用for循环迭代移位的次数,然后对数组数据执行一次移位。

函数主要(){/ /代码省略/ /得到结果结果=getResultsUsingLoop();/ /代码省略}函数getResultsUsingLoop(){leftRotate=函数(结果){临时=(];(var=0;<n-1;++){临时(]=结果(+1];}临时(]=结果(0];返回临时;};结果=数据拼接(0);(=0;<d;++){结果=leftRotate(结果);}返回结果;}

main ()函数未发生更改,而调用getResultsUsingLoop ()函数来获取结果数组。

快速解释一下这种方法:

  • 我创建了一个闭包函数,名为leftRotate ()它只做一次左旋转。我创建了一个临时数组来存储移位后的数组。然后遍历每个元素,将数组中的下一个元素设置为当前位置。最后一个值为未定义的因为它在源的边界之外数据。因此,我只是将最后一个位置的值设置为源数组第一个位置的值。
  • 我创建了一个数据的副本,并将其存储进去结果
  • 然后对存储的移位数进行迭代d传入前一次迭代的结果。
  • 返回新结果数组中。

我对这一做法的评价:

  • 它是长的。
  • 它有点笨拙,因为我们必须纠正超出源数组的边界。
  • 时间复杂度:O(n * d)

第二:array.map ()

函数主要(){/ /代码省略/ /得到结果结果=getResultUsingArrayMap();/ /代码省略}函数getResultUsingArrayMap(){结果=数据地图(函数(价值,指数){pos=方法用于(指数)+方法用于(d-1);如果(pos>n-1){pos=pos-n;}返回数据(pos];});返回结果;}

快速解释一下这种方法:

  • getResultUsingArrayMap ()函数使用array.map ()函数迭代数组中的每个元素。
  • 在每次迭代中,我计算其中元素的位置数据考虑到指数然后把它储存起来pos
  • 我返回源中的值数据

我对这一做法的评价:

  • 这比我的第一个方法短。
  • 计算pos对于每个迭代都要检查是否已经超出了数组的边界。
  • 时间复杂度:O (n)

第三:array.shift ()

函数主要(){/ /代码省略/ /得到结果结果=getResultsUsingArrayShift();/ /代码省略}函数getResultsUsingArrayShift(){临时=数据拼接(0);(=0;<d-1;++){第一个=临时转变();临时(第一个);}返回临时;}

当我更多地思考这个问题时,我意识到我并没有利用它Array.prototype方法如转变()push ()

快速解释一下这种方法:

  • getResultsUsingArrayShift ()函数复制源文件数据并将其存储在一个名为临时
  • 然后迭代给定的旋转次数n
  • 在每个迭代中我调用array.shift ()并将第一个元素存储到变量中第一个。然后我push ()数组末尾的第一个元素。

我对这一做法的评价:

  • 这是非常简短和简单的。
  • 利用转变()push ()方法减少复杂性和时间。
  • 时间复杂度:O (n)

您可以下载源代码或在GitHub上派生库:

执行

执行解决方案很容易:

节点array-left-rotation.js美元<data.txt

布莱恩F爱

嗨,我是布莱恩。我对TypeScript, Angular和Node.js感兴趣。我和我最好的朋友邦妮结婚了,我住在波特兰,我经常滑雪。