当前位置: 首页 > 面试题库 >

旋转JavaScript中数组中的元素

尉迟京
2023-03-14
问题内容

我想知道旋转JavaScript数组的最有效方法是什么。

我想出了这个解决方案,其中一个正数n将数组向右旋转,而一个负数n向左(-length < n < length):

Array.prototype.rotateRight = function( n ) {
  this.unshift( this.splice( n, this.length ) );
}

然后可以使用这种方式:

var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
months.rotate( new Date().getMonth() );

在下面的评论中指出的那样,我上面的原始版本有一个缺陷,那就是正确的版本(附加返回值允许链接):

Array.prototype.rotateRight = function( n ) {
  this.unshift.apply( this, this.splice( n, this.length ) );
  return this;
}

是否有可能在JavaScript框架中更紧凑和/或更快速的解决方案?(以下任何一种建议的版本都不会更紧凑或更快速)

有没有内置数组旋转的JavaScript框架?(仍然没有任何人回答)


问题答案:

类型安全的通用版本,可更改数组:

Array.prototype.rotate = (function() {
    // save references to array functions to make lookup faster
    var push = Array.prototype.push,
        splice = Array.prototype.splice;

    return function(count) {
        var len = this.length >>> 0, // convert to uint
            count = count >> 0; // convert to int

        // convert count to value in range [0, len)
        count = ((count % len) + len) % len;

        // use splice.call() instead of this.splice() to make function generic
        push.apply(this, splice.call(this, 0, count));
        return this;
    };
})();

在评论中,Jean提出了代码不支持push()and的重载的问题splice()。我不认为这真的有用(请参阅评论),但是一种快速的解决方案(虽然有点hack)将替换该行

push.apply(this, splice.call(this, 0, count));

与此:

(this.push || push).apply(this, (this.splice || splice).call(this, 0, count));

在Opera 10中,使用unshift()而不是push()几乎快一倍,而FF的差异可以忽略不计。编码:

Array.prototype.rotate = (function() {
    var unshift = Array.prototype.unshift,
        splice = Array.prototype.splice;

    return function(count) {
        var len = this.length >>> 0,
            count = count >> 0;

        unshift.apply(this, splice.call(this, count % len, len));
        return this;
    };
})();


 类似资料:
  • 问题内容: 您将获得一个排序和旋转的数组,如下所示: 如果您注意到数组已排序和旋转。您需要以 o(log n) 时间复杂度搜索上述数组中的元素。 问题答案: 您可以使用线性搜索在上述数组中搜索元素,但这需要 o(n)。 您可以使用二进制搜索算法的变体来解决上述问题。您可以使用可以将数组划分为两个排序的子数组({16,19,21,25},{3,5,8,10} )的属性,尽管您不需要找到枢轴点(元素开

  • 问题内容: 在一个程序中,我正在写一个旋转二维数组的需求。在寻找最佳解决方案时,我发现了这种令人印象深刻的一线功能: 我现在在程序中使用它,它按预期工作。我的问题是,我不了解它是如何工作的。 如果有人可以解释所涉及的不同功能如何实现所需的结果,我将不胜感激。 问题答案: 考虑以下二维列表: 让我们将其逐步分解: 此列表传递给使用参数unpacking,因此调用最终等效于此: 希望注释能够清楚说明其

  • https://www.hackerrank.com/challenges/ctci-array-left-rotation 对大小为 n 的数组执行左旋转操作会将数组的每个元素向左移动 1 个单位。例如,如果在数组 [1,2,3,4,5] 上执行 2 次左旋转,则数组将变为 [3,4,5,1,2] 执行 k 次旋转并打印。 这是我到目前为止得到的,但它只经过一次交互,看不出我做错了什么

  • 问题内容: 因此,目标是将阵列中的元素正确旋转一次。举个例子; 如果, 则将成为 这是我所拥有的: 但是,这无法说明何时大于数组的长度。我读到我应该将更大的存储在另一个Array中,但是看到变量是不确定的,因此我不确定这是最好的解决方案。提前致谢。 问题答案: 在代码中添加一个模数组长度: 您还应该创建一个要复制到的新值,以免覆盖以后需要的值。

  • 问题内容: 是否可以轻松地“旋转” PHP中的数组? 像这样:1,2,3,4-> 2,3,4,1 为此有某种内置的PHP函数吗? 问题答案: 当前大多数答案都是正确的,但前提是您不关心索引: 输出: 要保留索引,您可以执行以下操作: 输出: 也许有人可以比我的四行方法更简洁地进行轮换,但这还是行得通的。

  • 我在学习GraphQL,尤其是StephenGrinder的udemy课程。 在他的视频中,他在旋转中使用了第三参数 请求对象具有详细信息,例如他们尝试访问的路由、查询字符串和正文等(用于身份验证) 我发现有点模糊地解释了 所以我在谷歌上搜索并从graphQL页面上阅读了这篇文章 此示例是用JavaScript编写的,但是GraphQL服务器可以用许多不同的语言构建。解析器函数接收四个参数: ob