javascript算法之数组反转

 更新时间:2022年08月11日 11:14:09   作者:乾复道  
这篇文章主要介绍了javascript算法之数组反转,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

1.数组反转

1.1 leecode题目-旋转数组

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

1.2 分析题目

  • 数组元素有序轮转,即轮转位置k,意味着,每个元素向后移k位,且长度n-k~n-1位置的元素会被挪移至最前方;
  • k为非负整数,所以,不存在向左轮转;

1.3解题思路

在不使用额外数组的前提下,我们可以有如下思考, 设数组长度为length,则

  • 需要轮转k位,即数组的最后k位会进行挪移至数组前方,即,当我们反转数组后,可以得知[0,k-1],[k,lenth-1]这两个数组,即为轮转之后的对应数组,但是,两个数组中的元素排序是反的;
  • 接下来,依次反转[0,k-1],[k,lenth-1],这两个数组,得到的数组就是答案了

1.4 代码

const reverseArray = (nums, start, end) => {
  while (start < end) {
    const temp = nums[start];
    nums[start] = nums[end];
    nums[end] = temp;
    start += 1;
    end -= 1;
  }
  return nums;
};
var reverseFunction = function(nums, k) {
  let length  = nums.length;
  nums = reverseArray(nums, 0, length - 1);
  nums = reverseArray(nums, 0, k - 1);
  nums = reverseArray(nums, k, length - 1);
};
reverseFunction([1,2,3,4,5,6,7],3);

输出:[5,6,7,1,2,3,4]

1.5 复杂度分析

  • 时间复杂度:时间复杂度:O(n),其中 nn 为数组的长度。每个元素被翻转两次,一共 n 个元素,因此总时间复杂度为 O(2n)=O(n)。
  • 空间复杂度:O(1)。只需要常数空间存放若干变量。

1.6 其他解法

思路:

  • 既然轮转k位,即[length-1-k,length-1]位置的元素变为[0,k-1]
  • [0,length-1-k]位置的元素变为[length-1-k,length-1]
  • 所以我们只需要将原数组拆分为[0,k-1],[length-1-k,length-1],然后将其按照[length-1-k,length-1]+[0,k-1]组装成一个数组即可

代码:

var reverseFunction2 = function(nums, k) {
  let length  = nums.length;
  let arrayLeft = nums.slice(0,length-k);
  let arrayRight = nums.slice(length-k);
  // return [...new Set([...arrayRight,...arrayLeft])];
  return arrayRight.concat(arrayLeft);
};
reverseFunction2([1,2,3,4,5,6,7],3);

大家会发现上述代码中,我注释了一行,因为,绝对诱人会想使用new Set方法去合并两个数组,那么,请注意,千万不能使用,因为,new Set方法,会讲两个数组进行合并后去重,如果原数组中出现相同元素,则,new Set将会给使用者狠狠上一课!

总结

算法的逻辑不同的人有不同的想法,但是殊途同归,答案是一致的,前提是,一定要靠清楚问题,仔细分析,验证的时候也要考虑各种情况。

到此这篇关于javascript算法之数组反转的文章就介绍到这了,更多相关javascript数组反转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • es6 super关键字的理解与应用实例分析

    es6 super关键字的理解与应用实例分析

    这篇文章主要介绍了es6 super关键字的理解与应用,结合实例形式分析了es6 super关键字的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2020-02-02
  • w3c编程挑战_初级脚本算法实战篇

    w3c编程挑战_初级脚本算法实战篇

    下面小编就为大家带来一篇w3c编程挑战_初级脚本算法实战篇。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • nodejs入门详解(多篇文章结合)

    nodejs入门详解(多篇文章结合)

    Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始。比较独特的是,Node.js会假设你是在POSIX环境下运行它Linux 或 Mac OS X
    2012-03-03
  • JavaScript中的连字符详解

    JavaScript中的连字符详解

    这篇文章主要是对JavaScript中的连字符进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • JavaScript实现随机数生成器(去重)

    JavaScript实现随机数生成器(去重)

    这篇文章主要为大家详细介绍了JavaScript实现随机数生成器,生成不重复的随机数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 让DIV的滚动条自动滚动到最底部的3种方法(推荐)

    让DIV的滚动条自动滚动到最底部的3种方法(推荐)

    下面小编就为大家带来一篇让DIV的滚动条自动滚动到最底部的3种方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • webpack源码之loader机制详解

    webpack源码之loader机制详解

    本篇文章主要介绍了webpack源码之loader机制详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • JavaScript实现简单图片翻转的方法

    JavaScript实现简单图片翻转的方法

    这篇文章主要介绍了JavaScript实现简单图片翻转的方法,涉及javascript操作图片与数组的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 一文搞懂JavaScript中的this绑定规则

    一文搞懂JavaScript中的this绑定规则

    这篇文章主要为大家详细介绍了原生JS之this绑定规则,这样大家再也不用担心this指向问题了。文中的示例代码讲解详细,需要的可以参考一下
    2022-09-09
  • js实现同一页面可多次调用的图片幻灯切换效果

    js实现同一页面可多次调用的图片幻灯切换效果

    这篇文章主要介绍了js实现同一页面可多次调用的图片幻灯切换效果,可实现在同一页面中多次调用幻灯切换效果,非常具有实用价值,需要的朋友可以参考下
    2015-02-02

最新评论