JavaScript算法題之如何將一個數(shù)組旋轉(zhuǎn)k步
一、題目描述:
將一個數(shù)組旋轉(zhuǎn)k步
- 輸入一個數(shù)組[1,2,3,4,5,6,7,8]
- 當k=3時,即旋轉(zhuǎn)3步
- 輸出[6,7,8,1,2,3,4,5]
二、思路分析:
兩種思路:
- 把末尾的元素挨個pop,然后unshift到數(shù)組后面
- 把數(shù)組拆分,最后concat拼接到一起
思路1:把末尾的元素挨個pop,然后unshift到數(shù)組后面
- JavaScript Array pop() 方法
刪除數(shù)組的最后一個元素:
var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.pop();
- JavaScript Array unshift() 方法
將新項目添加到數(shù)組的開頭:
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)運行結(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)運行結(jié)果

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


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