摘要:當我完成這個題目并且看到其他大神的答案時,我就覺得我真的很有必要記錄一下這道題,并且思考它在中的實現(xiàn)。表示被查找的值方法返回一個由替換值替換一些或所有匹配的模式后的新字符串。舉一反三,多多思考,多多實踐才是學習前端的最佳實踐。
之前,我在Codewars上看到一道名為Recover a secret string from random triplets的題,這道題使我沉思了很久,最終在朋友的幫助下我完成了這個題目。當我完成這個題目并且看到其他大神的答案時, 我就覺得我真的很有必要記錄一下這道題,并且思考它在JavaScript中的實現(xiàn)。
這道題目的大概意思是講:有一個密碼字符串存在,而你會獲得這個密碼字符串的隨機三個字符的集合,根據(jù)這個集合你需要還原出這個密碼字符串。
已知:
1.密碼字符串中不會出現(xiàn)重復的字母
2.這個集合包含了足可以推斷出密碼字符串的信息
3.密碼字符串不會不包含集合中的字母
英文好的朋友可以看下面的原文題干,題目作者解釋的比我清楚:
There is a secret string which is unknown to you. Given a collection
of random triplets from the string, recover the original string.A triplet here is defined as a sequence of three letters such that each letter occurs somewhere before the next in the given string."whi" is a triplet for the string "whatisup".
As a simplification, you may assume that no letter occurs more than once in the secret string. You can assume nothing about the triplets given to you other than that they are valid triplets and that they contain sufficientinformation to deduce the original string. In particular, this means
that the secret string will never contain letters that do not occur in
one of the triplets given to you.
也可以通過一個例子來理解題目:
secret1 = "whatisup" // 密碼字符串-->程序的輸出 triplets1 = [ // 集合 --> 程序的輸入 ["t","u","p"], ["w","h","i"], ["t","s","u"], ["a","t","s"], ["h","a","p"], ["t","i","s"], ["w","h","s"] ] var recoverSecret = function(triplets) { // ... -->程序的實現(xiàn) }
我認為這道題目做起來很舒服,雖然答案并不是第一時間很快就寫出來的,但是題干清楚簡單就免除了閱讀理解的煩擾也是杜絕了由于題意冗長 理解不到位造成了程序錯誤。而且實現(xiàn)方法也多種多樣,在做完答案后看看大神的最佳實踐也是一種享受。
下面是我的解決方案:
首先,列出集合中所有的字母,因為集合和密碼字符串中的字母種類是一致且無重復的,所以只需要把列出的所有字母去重就可以得到密碼字符串的無序排列。
triplets1 = [ // 原集合 ["t","u","p"], ["w","h","i"], ["t","s","u"], ["a","t","s"], ["h","a","p"], ["t","i","s"], ["w","h","s"] ] triplets2 =["t","u","p", // 列出的所有集合字母 "w","h","i","t","s","u", "a","t","s","h","a","p", "t","i","s","w","h","s"] triplets3 =["t","u","p","w","h","i","s","a"] // 去重后的集合 無序字符串
然后我們再根據(jù)原集合給出的排列規(guī)則將無序字符串進行排列,而通過觀察,我發(fā)現(xiàn)原集合中每個小數(shù)組之間的順序關系太過繁雜甚至有的小數(shù)組之間都沒有順序關系(比如 triplets1[0] 和 triplets1[1] ),那么最方便實現(xiàn)的解決辦法就是只顧及每個小數(shù)組三個字母之間的順序關系:
["t","u","p"] // 粗體--> 第一個小數(shù)組的第一個順序關系 ["t","u","p","w","h","i","s","a"] // 找到 "t" 和 "u" 發(fā)現(xiàn)順序正確 ["t","u","p"] // 粗體--> 第一個小數(shù)組的第二個順序關系 ["t","u","p","w","h","i","s","a"] // 找到 "u" 和 "p" 發(fā)現(xiàn)順序正確 ["w","h","i"] // 粗體--> 第二個小數(shù)組的第一個順序關系 ["t","u","p","w","h","i","s","a"] // 找到 "w" 和 "h" 發(fā)現(xiàn)順序正確 ["w","h","i"] // 粗體--> 第二個小數(shù)組的第二個順序關系 ["t","u","p","w","h","i","s","a"] // 找到 "h" 和 "i" 發(fā)現(xiàn)順序正確 ["t","s","u"] //粗體--> 第三個小數(shù)組的第一個順序關系 ["t","u","p","w","h","i","s","a"] // 找到 "t" 和 "s" 發(fā)現(xiàn)順序不正確 ["s","u","p","w","h","i","t","a"] // 交換位置 // ...依次類推,最后的結(jié)果是 ["w","t","a","h","p","i","u","s"]
很明顯可以看到只根據(jù)一次的比較還不足以得到結(jié)果的順序,所以我們要外套一個循環(huán),繼續(xù)使用原集合的順序信息繼續(xù)排序,直到全部排序完成輸出答案。
下面是我JavaScript的程序?qū)崿F(xiàn):
const recoverSecret =(triplets)=> { let result = "" // 排列集合字符串 去重 for(let i=0; i < triplets.length; i++){ for(let j = 0; j < triplets[i].length; j++){ if (result.indexOf(triplets[i][j]) == -1){ result += triplets[i][j] } } } // 用于標識while大循環(huán)是否進行 var flag = true while(flag){ flag = false for(let i = 0; i < triplets.length; i++){ for(let j = 0; j < 2; j++){ if (result.indexOf(triplets[i][j]) > result.indexOf(triplets[i][j+1])){ flag = true // 給交換字母位置 result = result.replace(triplets[i][j], triplets[i][j+1]).replace(triplets[i][j+1], triplets[i][j]) } } } } return result }
代碼中用到的API比較少,差不多為以下兩個:
String.indexOf(searchValue) 方法返回調(diào)用String對象中第一次出現(xiàn)的指定值的索引,開始在 fromIndex進行搜索。 searchValue表示被查找的值 String.replace(regexp, substr) 方法返回一個由替換值替換一些或所有匹配的模式后的新字符串。模式可以是一個字符串或者一個正則表達式, 替換值可以是一個字符串或者一個每次匹配都要調(diào)用的函數(shù)。 regexp表示要被替換的字符串 substr表示替換的字符串
*以上API資料來源于MDN
最后我要說 這個題目還遠遠沒有完,而它的迷人之處就在于它不止一個解決辦法,如果你沒有思路,可以在Codewars上粘貼我上面的代碼并提交(這樣你才可以看到別人的答案)研究大神的解決方案就會發(fā)現(xiàn)它的魅力。舉一反三,多多思考,多多實踐才是學習前端的最佳實踐。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107657.html
摘要:起因之前在網(wǎng)上看文章提到說,通過的方式安裝,可能安裝不是最新版本的情況,考慮到在下第一次安裝,以后肯定會有卸載重新安裝新版本的需求,剛好剛開始學習,索性練習下卸載重裝的過程。 起因 之前在網(wǎng)上看文章提到說,通過apt-get的方式安裝nginx,可能安裝不是最新版本的情況,考慮到在Ubuntu下第一次安裝nginx,以后肯定會有卸載重新安裝新版本的需求,剛好剛開始學習nginx,索性練...
摘要:實現(xiàn)方案首先小程序目前還是不支持的和的,那么如何讓它支持呢點擊下載,并把下載好的文件夾放到自己小程序的目錄下,包總共才多,體積很小的。如果想使用這些新的對象和方法,必須使用,為當前環(huán)境提供一個墊片。用于實現(xiàn)瀏覽器并不支持的原生的代碼。 前言 在平常的項目開發(fā)中肯定會遇到同步異步執(zhí)行的問題,還有的就是當執(zhí)行某一個操作依賴上一個執(zhí)行所返回的結(jié)果,那么這個時候你會如何解決這個問題呢; 1.是...
摘要:方案未引起重視,并沒有做出相應處理。頁面中元素的布局是相對的,因此一個元素的布局發(fā)生變化,會聯(lián)動地引發(fā)其他元素的布局發(fā)生變化。這里可以使用的和來分析的性能。寫在最后性能優(yōu)化是一門做減法的藝術。 歡迎一起交流 歡迎關注我的個人公眾號,不定期更新自己的工作心得。showImg(https://segmentfault.com/img/bVEk23?w=258&h=258); 正文從這里開始...
閱讀 2384·2021-11-11 16:54
閱讀 2640·2021-09-26 09:47
閱讀 3993·2021-09-08 09:36
閱讀 2743·2021-07-25 21:37
閱讀 934·2019-08-30 15:54
閱讀 2549·2019-08-30 14:22
閱讀 3258·2019-08-30 13:57
閱讀 2610·2019-08-29 17:17