亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript系列——數(shù)組元素左右移動(dòng)N位算法實(shí)現(xiàn)

WrBug / 3467人閱讀

摘要:拆分法當(dāng)我們沒有具體思路的時(shí)候,就先假設(shè)數(shù)組移動(dòng)位的情況。這里可以看成個(gè)數(shù)組,一個(gè)是沒有到達(dá)邊界的元素移動(dòng),一個(gè)是到達(dá)了邊界的元素移動(dòng),當(dāng)元素到達(dá)邊界,就會(huì)往數(shù)組的初始位置移動(dòng),形成了一個(gè)循環(huán)的過程。

引言

在自己剛剛畢業(yè)不久的時(shí)候,去了一家公司面試,面試官現(xiàn)場考了我這道題,我記憶深刻,當(dāng)時(shí)沒有想到思路,毫無疑問被面試官當(dāng)成菜鳥了。
最近剛好在研究數(shù)組的各種算法實(shí)現(xiàn),就想到這道題,可以拿來實(shí)現(xiàn)一下,紀(jì)念自己逝去的青春。

需求

假設(shè)有這樣一個(gè)數(shù)組

[1,2,3,4,5]

現(xiàn)在想要左移或者右移N位,比如移動(dòng)1位

//左移1位
[2,3,4,5,1]

//右移1位
[5,1,2,3,4]
算法實(shí)現(xiàn)

這樣一道題目,你先不要看我下面的代碼,自己思考一下如何實(shí)現(xiàn)它,不管是復(fù)雜的還是簡單的方法。
可以先告訴你我用了2行代碼實(shí)現(xiàn)左、右移動(dòng)元素。

拆分法 當(dāng)我們沒有具體思路的時(shí)候,就先假設(shè)數(shù)組移動(dòng)1位的情況。
[1,2,3,4,5]
=>
[null,1,2,3,4] and [5,null,null,null,null]
=>
[5,1,2,3,4]

這里可以看成2個(gè)數(shù)組,一個(gè)是沒有到達(dá)邊界的元素移動(dòng)[null,1,2,3,4],一個(gè)是到達(dá)了邊界的元素移動(dòng)[5,null,null,null,null],當(dāng)元素到達(dá)邊界,就會(huì)往數(shù)組的初始位置移動(dòng),形成了一個(gè)循環(huán)的過程。

很明顯,如果我們將這2個(gè)移動(dòng)后的數(shù)組合并起來,就是需求的結(jié)果。

移動(dòng)2位

同樣符合2個(gè)移動(dòng)后的數(shù)組合并起來為結(jié)果的情況

[1,2,3,4,5]
=>
[null,null,1,2,3] and [4,5,null,null,null]
=>
[4,5,1,2,3]
剛好移動(dòng)數(shù)組長度
[1,2,3,4,5]
=>
[1,2,3,4,5] and [] //如果沒有,就假設(shè)為空數(shù)組
合并數(shù)組

假設(shè)移動(dòng)1位的情況
上面的步驟,我們找到了規(guī)律,接下來要做的是找到2個(gè)數(shù)組,需要用到slice截取數(shù)組元素。
截取第一個(gè)數(shù)組

arr.slice(0,-1)
// [1,2,3,4]

截取第二個(gè)數(shù)組

arr.slice(-1)
// [5]

合并數(shù)組

arr.slice(-1).concat(arr.slice(0,-1))
// [5,1,2,3,4]

這樣你就實(shí)現(xiàn)了移動(dòng)1位的情況,接著,你繼續(xù)拿+5和-5范圍內(nèi)的數(shù)字進(jìn)行測試,發(fā)現(xiàn)都可以正常移動(dòng),當(dāng)數(shù)字大于5或者小于-5的時(shí)候,代碼就無效了,始終輸出[1,2,3,4,5]

arr.slice(-6).concat(arr.slice(0,-6))
// [1,2,3,4,5]

我們再加上一個(gè)小技巧,求余數(shù),假設(shè)是移動(dòng)6,那么,實(shí)際上和移動(dòng)1是相同的,我們就可以根據(jù)公式求余數(shù)

n = n%arr.length
// n = 6%5 余1

同理,當(dāng)移動(dòng)-6時(shí)

n = n%arr.length
// n = -6%5 余-1

接著帶入公式,發(fā)現(xiàn)輸出全部都正確了??!

思路分析完了,應(yīng)該很清晰了吧,源碼在下面、

算法源碼

arr表示原始數(shù)組,n表示移動(dòng)的距離,可以是正數(shù)、可以是0、也可以是負(fù)數(shù)、正數(shù)表示右移,負(fù)數(shù)表示左移,0表示不移動(dòng)。

function moveElement(arr, n) {
  if(Math.abs(n)>arr.length) n = n%arr.length
  return arr.slice(-n).concat(arr.slice(0,-n))
}

// moveElement(arr, 9)
// moveElement(arr, 0)
// moveElement(arr, -9)
總結(jié)

下次面試要是繼續(xù)碰到這道題,可能我又當(dāng)場忘記思路了?

補(bǔ)充

看到有評論討論不同方案的實(shí)現(xiàn),這些都很厲害,沒有唯一的答案,而思考解決方案的時(shí)候,要考慮的是時(shí)間復(fù)雜度,移動(dòng)數(shù)組的元素都會(huì)造成數(shù)組的重新排列。

第一步方案我覺得應(yīng)該是找到最小移動(dòng)位置的代價(jià),即移動(dòng)2和移動(dòng)2n是一樣的,我們就只需要移動(dòng)2,不需要再移動(dòng)n,求余數(shù)的作用在于此,根據(jù)移動(dòng)的位置切分出2個(gè)數(shù)組,不需要移動(dòng)元素,最后我用的是concat合并2個(gè)數(shù)組,返回一個(gè)新的數(shù)組副本,這樣就避免了移動(dòng)元素。

還有一種方案是將2個(gè)數(shù)組使用new Set(array1)和new Set(array2)設(shè)置為集合,集合是key、value的散列表,可以用最少的代價(jià)移動(dòng)位置,不導(dǎo)致重排,用集合移動(dòng)完之后,再Array.from()轉(zhuǎn)換回?cái)?shù)組。

切忌,不要嘗試去直接修改原數(shù)組的元素位置,這樣做代價(jià)非常大,尤其是數(shù)組長度很長的時(shí)候??!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/92556.html

相關(guān)文章

  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 冒泡排序、插入排序、選擇排序

    摘要:之所以把冒泡排序選擇排序插入排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r(shí)間復(fù)雜度都為。其中,冒泡排序就是原地排序算法。所以冒泡排序是穩(wěn)定的排序算法。選擇排序思路選擇排序算法的實(shí)現(xiàn)思路有點(diǎn)類似插入排序,也分已排序區(qū)間和未排序區(qū)間。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,...

    canger 評論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 十大經(jīng)典排序算法匯總

    摘要:筆者寫的數(shù)據(jù)結(jié)構(gòu)與算法之美系列用的語言是,旨在入門數(shù)據(jù)結(jié)構(gòu)與算法和方便以后復(fù)習(xí)。這應(yīng)該是目前較為簡單的十大經(jīng)典排序算法的文章講解了吧。比如原本在的前面,而,排序之后,在的后面十大經(jīng)典排序算法冒泡排序思想冒泡排序只會(huì)操作相鄰的兩個(gè)數(shù)據(jù)。 showImg(https://segmentfault.com/img/bVbvHet); 1. 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就...

    zsy888 評論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 歸并排序、快速排序、希爾排序、堆排序

    摘要:之所以把歸并排序快速排序希爾排序堆排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r(shí)間復(fù)雜度都為。歸并排序是一種穩(wěn)定的排序方法。因此,快速排序并不穩(wěn)定。希爾排序思想先將整個(gè)待排序的記錄序列分割成為若干子序列。 showImg(https://segmentfault.com/img/bVbvpYZ?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,只有內(nèi)功深厚者,前端之路才...

    haitiancoder 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<