JavaScript算法題之如何將一個(gè)數(shù)組旋轉(zhuǎn)k步
一、題目描述:
將一個(gè)數(shù)組旋轉(zhuǎn)k步
- 輸入一個(gè)數(shù)組[1,2,3,4,5,6,7,8]
- 當(dāng)k=3時(shí),即旋轉(zhuǎn)3步
- 輸出[6,7,8,1,2,3,4,5]
二、思路分析:
兩種思路:
- 把末尾的元素挨個(gè)pop,然后unshift到數(shù)組后面
- 把數(shù)組拆分,最后concat拼接到一起
思路1:把末尾的元素挨個(gè)pop,然后unshift到數(shù)組后面
- JavaScript Array pop() 方法
刪除數(shù)組的最后一個(gè)元素:
var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.pop();
- JavaScript Array unshift() 方法
將新項(xiàng)目添加到數(shù)組的開(kāi)頭:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.unshift("Lemon","Pineapple");TS代碼
function rotate1(arr:number[],k:number):number[]{
const length = arr.length
if(!k||length===0)return arr
const step = Math.abs(k%length)
for(let i =0;i<step;i++){
const n = arr.pop()
if(n){
arr.unshift(n)
}
}
return arr
}
const arr = [1,2,3,4,5,6,7,8]
const arr1 = rotate1(arr,3)
console.log(arr1)運(yùn)行結(jié)果

思路2:把數(shù)組拆分,最后concat拼接到一起
JavaScript Array slice() 方法
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"]; var citrus = fruits.slice(1, 3);
JavaScript 數(shù)組 Const
const array1 = ['a', 'b', 'c']; const array2 = ['d', 'e', 'f']; const array3 = array1.concat(array2); console.log(array3); // expected output: Array ["a", "b", "c", "d", "e", "f"]
TS代碼
/**
* 旋轉(zhuǎn)數(shù)組K步 -使用concat
* @param arr arr
* @param k k
* @returns arr
*/
function rotate2(arr:number[],k:number):number[]{
const length = arr.length
if(!k || length===0) return arr
const step = Math.abs(k%length)
const part1 = arr.splice(-step)
const part2 = arr.splice(0,length-step)
arr = arr.concat(part1,part2)
return arr
}
const arr2 = [1,2,3,4,5,6,7,8]
const arr3 = rotate2(arr2,3)
console.log(arr3)運(yùn)行結(jié)果

三、總結(jié):
分析代碼,整理思路,盡量找出最優(yōu)解,編寫(xiě)代碼不僅要書(shū)寫(xiě)功能測(cè)試,而且要養(yǎng)成編寫(xiě)單元測(cè)試的習(xí)慣,保證程序的健壯性
復(fù)雜度分析:
- 思路1的時(shí)間復(fù)雜度為O(n^2),空間復(fù)雜度為O(1)
- 思路2的時(shí)間復(fù)雜度為O(1),空間復(fù)雜度為O(n)
前端重時(shí)間輕空間,思路2更佳
時(shí)間復(fù)雜度O(1)和O(n)差別很大
5. 數(shù)組是一個(gè)有序結(jié)構(gòu),數(shù)組的unshift、shirt、splice操作都很慢,pop和push都很快,.slice不會(huì)改變?cè)瓟?shù)組,時(shí)間復(fù)雜度為0(1)
//性能測(cè)試
const arr4 = []
for(let i =0;i<10 * 10000;i++){
arr4.push(i)
}
console.time('rotate1')
rotate1(arr4,9*10000)
console.timeEnd('rotate1')
const arr5 = []
for(let i=0;i< 10 * 10000;i++){
arr5.push(i)
}
console.time('rotate2')
rotate2(arr5,9*10000)
console.timeEnd('rotate2')
四、劃重點(diǎn)
- 注意算法時(shí)間復(fù)雜度(前端重時(shí)間,輕空間)
- 識(shí)破內(nèi)置API的時(shí)間復(fù)雜度(如unshift為0(n))
- 單元測(cè)試,考慮參數(shù)非法情況,提升代碼健壯性
到此這篇關(guān)于JavaScript算法題之如何將一個(gè)數(shù)組旋轉(zhuǎn)k步的文章就介紹到這了,更多相關(guān)JavaScript數(shù)組旋轉(zhuǎn)k步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript動(dòng)態(tài)添加css樣式和script標(biāo)簽
這篇文章主要介紹了JavaScript動(dòng)態(tài)添加css樣式和script標(biāo)簽的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
Javascript 一些需要注意的細(xì)節(jié)(必看篇)
下面小編就為大家?guī)?lái)一篇Javascript 一些需要注意的細(xì)節(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
js 數(shù)組操作之pop,push,unshift,splice,shift
本篇文章主要介紹了js數(shù)組操作之pop,push,unshift,splice,shift。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01
alert中斷settimeout計(jì)時(shí)功能
在測(cè)試過(guò)程中發(fā)現(xiàn)alert會(huì)中斷settimeout的計(jì)時(shí)功能,關(guān)閉對(duì)話框后,settimeout的時(shí)間會(huì)重頭開(kāi)始計(jì)時(shí),而不是從中斷處,感興趣的朋友可以了解下2013-07-07
獲取當(dāng)前按鈕或者h(yuǎn)tml的ID名稱實(shí)例(推薦)
下面小編就為大家?guī)?lái)一篇獲取當(dāng)前按鈕或者h(yuǎn)tml的ID名稱實(shí)例(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
js中的異步獲取到的數(shù)據(jù)到底能不能賦值給一個(gè)全局變量問(wèn)題
這篇文章主要介紹了js中的異步獲取到的數(shù)據(jù)到底能不能賦值給一個(gè)全局變量問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
JS獲取中文拼音首字母并通過(guò)拼音首字母快速查找頁(yè)面內(nèi)對(duì)應(yīng)中文內(nèi)容的方法【附demo源碼】
這篇文章主要介紹了JS獲取中文拼音首字母并通過(guò)拼音首字母快速查找頁(yè)面內(nèi)對(duì)應(yīng)中文內(nèi)容的方法,涉及javascript針對(duì)字符串的遍歷、查找、正則匹配及轉(zhuǎn)換等操作技巧,并附帶完整demo源碼供讀者下載參考,需要的朋友可以參考下2016-08-08
JS highcharts實(shí)現(xiàn)動(dòng)態(tài)曲線代碼示例
這篇文章主要介紹了JS highcharts實(shí)現(xiàn)動(dòng)態(tài)曲線代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10


5. 數(shù)組是一個(gè)有序結(jié)構(gòu),數(shù)組的unshift、shirt、splice操作都很慢,pop和push都很快,.slice不會(huì)改變?cè)瓟?shù)組,時(shí)間復(fù)雜度為0(1)