摘要:前面兩個數(shù)組已經(jīng)完成了排列組合,結(jié)果在中,所以替換掉。偶然看到一個求字符串內(nèi)字符全排列的算法比如給定一個字符串得出的結(jié)果是該方法是通過遞歸完成的。加上這一行,起到無重復(fù)字母的效果在網(wǎng)上看了很多算法,學(xué)習(xí)了很多。
幾個數(shù)組元素的排列組合問題。比如["A","B"],["C","D","E"],["F","G"],其排列組合的結(jié)果是["A","C","F"],["A","C","G"],["A","D","F"],......,["B","E","F"],["B","E","G"],共有2x3x2=12種結(jié)果,那么,如何用程序?qū)崿F(xiàn)。
簡單的思路就是先把前面兩個數(shù)組的元素做排列組合,產(chǎn)生的新數(shù)組再和后面的數(shù)組做排列組合,始終是在做兩個數(shù)組的排列組合操作。
function sku(arr){ if(arr.length<1) return null; if(arr.length<2) return arr[0]; var result=[]; var firstArr=arr[0]; for(var i = 0 ; i < firstArr.length ; i ++){ //這里是將第一個數(shù)組里面的元素變成數(shù)組,方便后續(xù)進(jìn)行concat操作。 result.push([firstArr[i]]); } arr.splice(0,1,result); while(arr.length>1){ var targetArr=arr[0]; var nextArr=arr[1]; var result=[]; for(var i = 0 ; i < targetArr.length; i ++){//進(jìn)行排列組合 for(var j = 0 ; j < nextArr.length; j ++){ var tmp=([].concat(targetArr[i])); //將數(shù)據(jù)復(fù)制到新的數(shù)組里面,因?yàn)楹罄m(xù)targetArr[i]還會被用到。不能直接更改targetArr[i]這個數(shù)組。 tmp.push(nextArr[j]);// result.push(tmp); } } arr.splice(0,2,result);//前面兩個數(shù)組已經(jīng)完成了排列組合,結(jié)果在result中,所以替換掉。 } }
以arr=[["A","B"],["C","D","E"],["F","G"]]作為輸入。
for(var i = 0 ; i < firstArr.length ; i ++){ //這里是將第一個數(shù)組里面的元素變成數(shù)組,方便后續(xù)進(jìn)行concat操作。 result.push([firstArr[i]]); }
arr的結(jié)果就變成了[[["A"],["B"]],["C","D","E"],["F","G"]].
然后經(jīng)過第一次循環(huán),將[["A"],["B"]],["C","D","E"]兩個數(shù)組合并,
變成了result這個數(shù)組的內(nèi)容是[["A","C"],["A","D"],["A","E"],["B","C"],["B","D"],["B","E"]].
arr.splice(0,2,result);
將合并后的數(shù)組去除,然后將合并的結(jié)果放到原數(shù)組列表里面,數(shù)組長度-1,當(dāng)原數(shù)組只有一個元素時,就是最終結(jié)果。
偶然看到一個求字符串內(nèi)字符全排列的算法比如給定一個字符串"abc",得出的結(jié)果是abc,acb,bac,bca,cab,cba.
該方法是通過遞歸完成的。
var result = []; function permutations(str){ var arr= str.split(""); helper(arr,0,[]); return result; } function helper(arr,index,list){ if(index === arr.length){ result.push(list.join("")); return; } for(var i = 0;i大意是指每次從原數(shù)組里面選擇一個目標(biāo)數(shù)組里面沒有的字符串,直到目標(biāo)數(shù)組長度和原數(shù)組一樣,然后做一個join就得出了結(jié)果。
然后我發(fā)現(xiàn)我上面的方法也能達(dá)成這個目的,只不過要構(gòu)建字符串長度這么多的數(shù)組。
每個數(shù)組的內(nèi)容都一樣,就是字符串split("")以后的結(jié)果。
然后為了保證不重復(fù),可以把for循環(huán)中加一句。for(var i = 0 ; i < targetArr.length; i ++){ for(var j = 0 ; j < nextArr.length; j ++){ var tmp=([].concat(targetArr[i])); if(tmp.indexOf(nextArr[j])!=-1) continue; //加上這一行,起到無重復(fù)字母的效果 tmp.push(nextArr[j]); result.push(tmp); } }在網(wǎng)上看了很多算法,學(xué)習(xí)了很多。有對的,也有錯的;有的簡單有效,有的瘋狂繞圈。有時候覺得高深莫測,看懂了以后發(fā)現(xiàn)完全沒必要。還是自己試試。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/90098.html
摘要:強(qiáng)烈推薦上值得前端學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)與算法項(xiàng)目,包含圖的演示過程與視頻講解。該倉庫包含了多種基于的算法與數(shù)據(jù)結(jié)構(gòu),提供進(jìn)一步閱讀的解釋和鏈接。數(shù)據(jù)結(jié)構(gòu)和算法必知必會的個代碼實(shí)現(xiàn)。 showImg(https://segmentfault.com/img/bVbvpYZ); 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就算招式練的再花哨,終究成不了高手;只有內(nèi)功深厚者,前端之路才會走得...
摘要:常見的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。用一張圖概括歸并排序英語,或,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為。 常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:常見的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。用一張圖概括歸并排序英語,或,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為。 常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:常見的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。用一張圖概括歸并排序英語,或,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為。 常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:快速排序是不穩(wěn)定的排序算法。瀏覽器的實(shí)現(xiàn)不同有什么影響排序算法不穩(wěn)定有什么影響舉個例子某市的機(jī)動車牌照拍賣系統(tǒng),最終中標(biāo)的規(guī)則為按價格進(jìn)行倒排序相同價格則按照競標(biāo)順位即價格提交時間進(jìn)行正排序。 本文要解決的問題 1、找出 Array.prototype.sort 使用的什么排序算法 2、用一種直觀的方式展示 Array.prototype.sort 的時間復(fù)雜度,看看它有多快? 3、...
摘要:摘要是如何回收內(nèi)存的深入淺出系列深入淺出第課箭頭函數(shù)中的究竟是什么鬼深入淺出第課函數(shù)是一等公民是什么意思呢深入淺出第課什么是垃圾回收算法最近垃圾回收這個話題非常火,大家不能隨隨便便的扔垃圾了,還得先分類,這樣方便對垃圾進(jìn)行回收再利用。 摘要: JS是如何回收內(nèi)存的? 《JavaScript深入淺出》系列: JavaScript深入淺出第1課:箭頭函數(shù)中的this究竟是什么鬼? Jav...
閱讀 1345·2021-09-22 15:18
閱讀 2677·2021-09-22 15:17
閱讀 2285·2019-08-30 15:55
閱讀 1625·2019-08-30 15:54
閱讀 1116·2019-08-30 13:12
閱讀 669·2019-08-30 13:12
閱讀 1729·2019-08-29 11:33
閱讀 1488·2019-08-26 17:04