成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一道簡(jiǎn)單的多維數(shù)組取值問題

tracymac7 / 3472人閱讀

摘要:?jiǎn)栴}簡(jiǎn)述給予一個(gè)多維數(shù)組和一個(gè)描述取值路徑的一維數(shù)組通過調(diào)用函數(shù)返回取值路徑描述的值,如原問題傳送門之所以想記錄一下是因?yàn)橹坝性谒㈩}的習(xí)慣,后來工作忙就怠慢了,今天閑來無事就準(zhǔn)備刷幾道玩玩,然后就挑了一個(gè)比較簡(jiǎn)單的中的難度評(píng)級(jí)的題。

問題簡(jiǎn)述

給予一個(gè)多維數(shù)組和一個(gè)描述取值路徑的一維數(shù)組, 通過調(diào)用函數(shù)f返回取值路徑描述的值,如
f([[1, 2], [3, 4], [5, 6]], [0, 0]) -> 1

原問題傳送門

之所以想記錄一下是因?yàn)橹坝性?b>codewars刷題的習(xí)慣,后來工作忙就怠慢了,今天閑來無事就準(zhǔn)備刷幾道玩玩,然后就挑了一個(gè)比較簡(jiǎn)單的7kyucodewars中的難度評(píng)級(jí))的題。

因?yàn)檫@題比較簡(jiǎn)單,我也沒多想,上來就干,仔細(xì)想了下,很容易嘛,不就是遞歸嗎?按大學(xué)老師教的來一套:

先找遞歸退出的條件,當(dāng)路徑取到最后或者目標(biāo)數(shù)組已經(jīng)取盡(這里似乎題目沒有說清楚,暫定不對(duì)取值路徑做限定吧)

再找遞歸的模式, 如果不滿足遞歸退出的條件,則將目標(biāo)數(shù)組縮小一維,傳遞新的取值路徑并遞歸

然后就有了第一版代碼

function getElement(array, indexes) {
  const idx = indexes.shift()
  
  if(indexes.length === 0 || array[idx].constructor !== Array ) return array[idx]
  else return getElement(array[idx], indexes)
}

然后跑了跑作者提供的簡(jiǎn)單測(cè)試用例,all passed,我就說嘛,這么簡(jiǎn)單的題目不一把過豈不是有點(diǎn)丟臉,然后就直接點(diǎn)了提交,然后就蹦了一大片的failed測(cè)試用例出來,仔細(xì)看了看失敗的測(cè)試用例,并沒有看懂,因?yàn)槎际呛芏嗄婷畹臄?shù)據(jù),并且每次返回的結(jié)果都不一致(后來才知道是隨機(jī)的用例)。

之后一直以為是自己有一些邊界情況沒有考慮到,就前前后后又看了幾次自己的答案,并沒有發(fā)現(xiàn)什么大的問題,但是無論怎么提交都是失敗。之后前前后后大概看了15分鐘左右,突然就覺得是我自己把問題想簡(jiǎn)單了。

因?yàn)樽罱恢痹诳春瘮?shù)式的東西,突然就聯(lián)想到,自己寫的這個(gè)函數(shù),并不。關(guān)于純函數(shù)是函數(shù)式編程中最基本的概念之一,所謂純既是要求函數(shù)沒有副作用,我這里的getElement使用了Array.shift方法,會(huì)對(duì)原數(shù)組進(jìn)行修改,從而產(chǎn)生副作用。這么一想一下就和之前每次跑用例總是產(chǎn)生意想不到的結(jié)果的情況聯(lián)系上了,隨機(jī)用例的失敗原因一定是因?yàn)闇y(cè)試路徑會(huì)有很多個(gè),但是測(cè)試目標(biāo)數(shù)組只有一個(gè),因此有副作用的話,只有第一次測(cè)試的結(jié)果是正確的,后面都會(huì)因副作用產(chǎn)生不同的結(jié)果。

既然是因?yàn)閿?shù)組是引用類型而產(chǎn)生的問題,那么直接來一個(gè)深拷貝就可以了。因?yàn)檫@里只是答題,所以使用一個(gè)最簡(jiǎn)單粗暴的深拷貝大法x => JSON.parse(JSON.stringify(x)),然后代碼就有了第二版代碼

function getElement(array, indexes) {
  array = JSON.parse(JSON.stringify(array))
  indexes = JSON.parse(JSON.stringify(indexes))
  
  const idx = indexes.shift()
  
  if(indexes.length === 0 || array[idx].constructor !== Array ) return array[idx]
  else return getElement(array[idx], indexes)
}

之后提交,所有的用例都通過了。但是還沒有結(jié)束,因?yàn)樽约旱拇a在實(shí)現(xiàn)上還是挺啰嗦的,同時(shí)還使用了深拷貝大法,有沒有更簡(jiǎn)單的方法呢?

有的。如果仔細(xì)思考一下,這里的解題的思路其實(shí)和Array.reduce的模式很像

對(duì)一個(gè)數(shù)組進(jìn)行遍歷(對(duì)路徑數(shù)組進(jìn)行遍歷)

每次遍歷返回一個(gè)值,并作為參數(shù)傳入下一次遍歷(對(duì)目標(biāo)函數(shù)的降維)

在遍歷完成后,返回一個(gè)結(jié)果(取值路徑對(duì)應(yīng)的值)

因此利用Array.reduce,這個(gè)問題一行代碼就可以解決,如下

function getElement(array, indexes) {
  return indexes.reduce((a, i) => a[i], array);
}

同樣多考慮一下,它是純函數(shù)嗎?是的,它是純的。因?yàn)檫@里只做了取值的操作(a[i]),并不涉及任何的修改原數(shù)組的操作。這個(gè)答案也是在我提交后,所有答案中實(shí)現(xiàn)方案最好的一個(gè)。

當(dāng)然還有其他的暴力破解法,我覺的想法也不錯(cuò),比如

function getElement(array, indexes) {
  return eval(`array[${indexes.join("][")}]`);
}

還有利用spread運(yùn)算符的方法,如

const getElement = (array,[index,...moreIndices]) => moreIndices.length ? getElement( array[index], moreIndices ) : array[index]

所以說工作累了,或者閑來無事,刷刷題還是挺有意思的,可以看見一些自己平時(shí)很熟悉但是在需要用時(shí)又難以想起的知識(shí)。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92220.html

相關(guān)文章

  • 一道面試題引起思考

    摘要:這個(gè)時(shí)候查了下正則表達(dá)式的文檔文檔點(diǎn)擊這里,發(fā)現(xiàn)有一個(gè)方法,可以返回匹配成功的結(jié)果。那么我來總結(jié)下文章想表達(dá)的內(nèi)容對(duì)于具有固定格式的字符串,可以考慮使用正則表達(dá)式來識(shí)別和匹配。 今天在認(rèn)真干(劃)活(水)的時(shí)候,看到群里有人發(fā)了一道頭條的面試題,就順便看了一下,發(fā)現(xiàn)挺有意思的,就決定分享給大家,并且給出我的解決方案和思考過程。 題目如下: 實(shí)現(xiàn)一個(gè)get函數(shù),使得下面的調(diào)用可以輸出正確...

    xiaoqibTn 評(píng)論0 收藏0
  • 一道面試題引起思考

    摘要:這個(gè)時(shí)候查了下正則表達(dá)式的文檔文檔點(diǎn)擊這里,發(fā)現(xiàn)有一個(gè)方法,可以返回匹配成功的結(jié)果。那么我來總結(jié)下文章想表達(dá)的內(nèi)容對(duì)于具有固定格式的字符串,可以考慮使用正則表達(dá)式來識(shí)別和匹配。 今天在認(rèn)真干(劃)活(水)的時(shí)候,看到群里有人發(fā)了一道頭條的面試題,就順便看了一下,發(fā)現(xiàn)挺有意思的,就決定分享給大家,并且給出我的解決方案和思考過程。 題目如下: 實(shí)現(xiàn)一個(gè)get函數(shù),使得下面的調(diào)用可以輸出正確...

    snowLu 評(píng)論0 收藏0
  • 一道面試題引起思考

    摘要:這個(gè)時(shí)候查了下正則表達(dá)式的文檔文檔點(diǎn)擊這里,發(fā)現(xiàn)有一個(gè)方法,可以返回匹配成功的結(jié)果。那么我來總結(jié)下文章想表達(dá)的內(nèi)容對(duì)于具有固定格式的字符串,可以考慮使用正則表達(dá)式來識(shí)別和匹配。 今天在認(rèn)真干(劃)活(水)的時(shí)候,看到群里有人發(fā)了一道頭條的面試題,就順便看了一下,發(fā)現(xiàn)挺有意思的,就決定分享給大家,并且給出我的解決方案和思考過程。 題目如下: 實(shí)現(xiàn)一個(gè)get函數(shù),使得下面的調(diào)用可以輸出正確...

    hlcc 評(píng)論0 收藏0
  • 一道有意思編程思考題:【妖怪和和尚過河問題

    摘要:不斷地窮舉下一步的可能性,直到最終達(dá)成目標(biāo)。表示船在左邊表示船在右邊打印答案妖怪過河數(shù)僧人過河數(shù)船上是否安全左岸是否安全右岸是否安全過河后的數(shù)據(jù)過河后的數(shù)據(jù)簡(jiǎn)單地看下深度優(yōu)先搜索的函數(shù),每次根據(jù)船所在的位置,枚舉下個(gè)狀態(tài)值。 無意中看到這么一道題,覺得很有意思,題目如下: 有三個(gè)和尚和三個(gè)妖怪要利用唯一的一條小船過河,這條小船一次只能載兩個(gè)人,同時(shí),無論是在河的兩岸還是在船上,只要妖怪...

    asce1885 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

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