摘要:?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)單的7kyu(codewars中的難度評(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
摘要:這個(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)用可以輸出正確...
摘要:這個(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)用可以輸出正確...
摘要:這個(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)用可以輸出正確...
摘要:不斷地窮舉下一步的可能性,直到最終達(dá)成目標(biāo)。表示船在左邊表示船在右邊打印答案妖怪過河數(shù)僧人過河數(shù)船上是否安全左岸是否安全右岸是否安全過河后的數(shù)據(jù)過河后的數(shù)據(jù)簡(jiǎn)單地看下深度優(yōu)先搜索的函數(shù),每次根據(jù)船所在的位置,枚舉下個(gè)狀態(tài)值。 無意中看到這么一道題,覺得很有意思,題目如下: 有三個(gè)和尚和三個(gè)妖怪要利用唯一的一條小船過河,這條小船一次只能載兩個(gè)人,同時(shí),無論是在河的兩岸還是在船上,只要妖怪...
閱讀 3955·2021-11-17 09:33
閱讀 3296·2021-10-08 10:05
閱讀 3124·2021-09-22 15:36
閱讀 1151·2021-09-06 15:02
閱讀 2780·2019-08-29 12:45
閱讀 1599·2019-08-26 13:40
閱讀 3409·2019-08-26 13:37
閱讀 431·2019-08-26 13:37