javascript算法之?dāng)?shù)組反轉(zhuǎn)
1.數(shù)組反轉(zhuǎn)
1.1 leecode題目-旋轉(zhuǎn)數(shù)組
給你一個(gè)數(shù)組,將數(shù)組中的元素向右輪轉(zhuǎn) k 個(gè)位置,其中 k 是非負(fù)數(shù)。
示例:
輸入: nums = [1,2,3,4,5,6,7], k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右輪轉(zhuǎn) 1 步: [7,1,2,3,4,5,6]
向右輪轉(zhuǎn) 2 步: [6,7,1,2,3,4,5]
向右輪轉(zhuǎn) 3 步: [5,6,7,1,2,3,4]
1.2 分析題目
- 數(shù)組元素有序輪轉(zhuǎn),即輪轉(zhuǎn)位置k,意味著,每個(gè)元素向后移k位,且長度n-k~n-1位置的元素會(huì)被挪移至最前方;
- k為非負(fù)整數(shù),所以,不存在向左輪轉(zhuǎn);
1.3解題思路
在不使用額外數(shù)組的前提下,我們可以有如下思考, 設(shè)數(shù)組長度為length,則
- 需要輪轉(zhuǎn)k位,即數(shù)組的最后k位會(huì)進(jìn)行挪移至數(shù)組前方,即,當(dāng)我們反轉(zhuǎn)數(shù)組后,可以得知[0,k-1],[k,lenth-1]這兩個(gè)數(shù)組,即為輪轉(zhuǎn)之后的對(duì)應(yīng)數(shù)組,但是,兩個(gè)數(shù)組中的元素排序是反的;
- 接下來,依次反轉(zhuǎn)[0,k-1],[k,lenth-1],這兩個(gè)數(shù)組,得到的數(shù)組就是答案了
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 復(fù)雜度分析
- 時(shí)間復(fù)雜度:時(shí)間復(fù)雜度:O(n),其中 nn 為數(shù)組的長度。每個(gè)元素被翻轉(zhuǎn)兩次,一共 n 個(gè)元素,因此總時(shí)間復(fù)雜度為 O(2n)=O(n)。
- 空間復(fù)雜度:O(1)。只需要常數(shù)空間存放若干變量。
1.6 其他解法
思路:
- 既然輪轉(zhuǎn)k位,即[length-1-k,length-1]位置的元素變?yōu)閇0,k-1]
- [0,length-1-k]位置的元素變?yōu)閇length-1-k,length-1]
- 所以我們只需要將原數(shù)組拆分為[0,k-1],[length-1-k,length-1],然后將其按照[length-1-k,length-1]+[0,k-1]組裝成一個(gè)數(shù)組即可
代碼:
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);
大家會(huì)發(fā)現(xiàn)上述代碼中,我注釋了一行,因?yàn)?,絕對(duì)誘人會(huì)想使用new Set方法去合并兩個(gè)數(shù)組,那么,請(qǐng)注意,千萬不能使用,因?yàn)?,new Set方法,會(huì)講兩個(gè)數(shù)組進(jìn)行合并后去重,如果原數(shù)組中出現(xiàn)相同元素,則,new Set將會(huì)給使用者狠狠上一課!
總結(jié)
算法的邏輯不同的人有不同的想法,但是殊途同歸,答案是一致的,前提是,一定要靠清楚問題,仔細(xì)分析,驗(yàn)證的時(shí)候也要考慮各種情況。
到此這篇關(guān)于javascript算法之?dāng)?shù)組反轉(zhuǎn)的文章就介紹到這了,更多相關(guān)javascript數(shù)組反轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
three.js開發(fā)3d地圖的實(shí)現(xiàn)示例
本文主要介紹了three.js開發(fā)3d地圖的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07JS函數(shù)(普通函數(shù),箭頭函數(shù))中this的指向問題詳解
這篇文章主要給大家介紹了JS中普通函數(shù)和箭頭函數(shù)的this指向,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09用函數(shù)模板,寫一個(gè)簡單高效的 JSON 查詢器的方法介紹
本篇文章小編將為大家介紹,用函數(shù)模板,寫一個(gè)簡單高效的 JSON 查詢器的方法介紹,需要的朋友可以參考一下2013-04-04JavaScript通過極大極小值算法實(shí)現(xiàn)AI井字棋游戲
極小極大值搜索算法是一種零和算法,是用來最小化對(duì)手的利益,最大化自己的利益的算法。極小極大之搜索算法常用于棋類游戲等雙方較量的游戲和程序,算是一種電腦AI算法。本文將介紹通過這個(gè)算法實(shí)現(xiàn)的一個(gè)井字棋游戲,需要的可以參考一下2021-12-12JavaScript代碼性能優(yōu)化總結(jié)(推薦)
下面小編就為大家?guī)硪黄狫avaScript代碼性能優(yōu)化總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧,祝大家游戲愉快哦2016-05-05MVVM模式中ViewModel和View、Model有什么區(qū)別?
這篇文章主要介紹了MVVM模式中ViewModel和View、Model有什么區(qū)別?本文分別解釋了它們的功能和作用,然后總結(jié)了它之間的區(qū)別,需要的朋友可以參考下2015-06-06JS實(shí)現(xiàn)瀏覽器打印、打印預(yù)覽示例
本篇文章主要介紹了JS實(shí)現(xiàn)瀏覽器打印、打印預(yù)覽示例。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02js中document.getElementById(id)的具體用法
本文主要介紹了js中document.getElementById(id)的具體用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04