javascript算法之从会用到理解 - 数组反转

简介: javascript算法之从会用到理解 - 数组反转

前言

OK,今天是一个简单的应用题材分析,算法的学习需要我们不断的去思考,今天的题目依然来自leecode。

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将会给使用者狠狠上一课!

总结

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

寄语

算法的验证,必要且一定,好的算法,少不了单元测试

目录
相关文章
|
2天前
|
搜索推荐 算法 Java
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
【5月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 0
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
|
2天前
|
JavaScript 前端开发 算法
JavaScript的垃圾回收机制通过标记-清除算法自动管理内存
【5月更文挑战第11天】JavaScript的垃圾回收机制通过标记-清除算法自动管理内存,免除开发者处理内存泄漏问题。它从根对象开始遍历,标记活动对象,未标记的对象被视为垃圾并释放内存。优化技术包括分代收集和增量收集,以提升性能。然而,开发者仍需谨慎处理全局变量、闭包、定时器和DOM引用,防止内存泄漏,保证程序稳定性和性能。
17 0
|
2天前
|
JavaScript
通过使用online表单的获取使用,了解vue.js数组的常用操作
通过使用online表单的获取使用,了解vue.js数组的常用操作
|
2天前
|
存储 算法 Java
数据结构与算法 数组和链表
数据结构与算法 数组和链表
11 0
|
2天前
|
存储 JavaScript 前端开发
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
深入了解JavaScript中的indexOf()方法:实现数组元素的搜索和索引获取
9 0
|
2天前
|
JavaScript 前端开发
js关于数组的方法
js关于数组的方法
11 0
|
2天前
|
算法 JavaScript 前端开发
三个js算法
三个js算法
8 2
|
2天前
|
算法 JavaScript
js的两个常用算法
js的两个常用算法
5 1
|
2天前
|
JavaScript 前端开发
js怎么清空数组?
js怎么清空数组?
14 0
|
2天前
|
存储 JavaScript 前端开发
js处理数组的方法
js处理数组的方法
14 2