摘要:前面两个数组已经完成了排列组合,结果在中,所以替换掉。偶然看到一个求字符串内字符全排列的算法比如给定一个字符串得出的结果是该方法是通过递归完成的。加上这一行,起到无重复字母的效果在网上看了很多算法,学习了很多。
几个数组元素的排列组合问题。比如["A","B"],["C","D","E"],["F","G"],其排列组合的结果是["A","C","F"],["A","C","G"],["A","D","F"],......,["B","E","F"],["B","E","G"],共有2x3x2=12种结果,那么,如何用程序实现。
简单的思路就是先把前面两个数组的元素做排列组合,产生的新数组再和后面的数组做排列组合,始终是在做两个数组的排列组合操作。
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 ++){ //这里是将第一个数组里面的元素变成数组,方便后续进行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 ++){//进行排列组合 for(var j = 0 ; j < nextArr.length; j ++){ var tmp=([].concat(targetArr[i])); //将数据复制到新的数组里面,因为后续targetArr[i]还会被用到。不能直接更改targetArr[i]这个数组。 tmp.push(nextArr[j]);// result.push(tmp); } } arr.splice(0,2,result);//前面两个数组已经完成了排列组合,结果在result中,所以替换掉。 } }
以arr=[["A","B"],["C","D","E"],["F","G"]]作为输入。
for(var i = 0 ; i < firstArr.length ; i ++){ //这里是将第一个数组里面的元素变成数组,方便后续进行concat操作。 result.push([firstArr[i]]); }
arr的结果就变成了[[["A"],["B"]],["C","D","E"],["F","G"]].
然后经过第一次循环,将[["A"],["B"]],["C","D","E"]两个数组合并,
变成了result这个数组的内容是[["A","C"],["A","D"],["A","E"],["B","C"],["B","D"],["B","E"]].
arr.splice(0,2,result);
将合并后的数组去除,然后将合并的结果放到原数组列表里面,数组长度-1,当原数组只有一个元素时,就是最终结果。
偶然看到一个求字符串内字符全排列的算法比如给定一个字符串"abc",得出的结果是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大意是指每次从原数组里面选择一个目标数组里面没有的字符串,直到目标数组长度和原数组一样,然后做一个join就得出了结果。
然后我发现我上面的方法也能达成这个目的,只不过要构建字符串长度这么多的数组。
每个数组的内容都一样,就是字符串split("")以后的结果。
然后为了保证不重复,可以把for循环中加一句。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; //加上这一行,起到无重复字母的效果 tmp.push(nextArr[j]); result.push(tmp); } }在网上看了很多算法,学习了很多。有对的,也有错的;有的简单有效,有的疯狂绕圈。有时候觉得高深莫测,看懂了以后发现完全没必要。还是自己试试。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/90098.html
摘要:强烈推荐上值得前端学习的数据结构与算法项目,包含图的演示过程与视频讲解。该仓库包含了多种基于的算法与数据结构,提供进一步阅读的解释和链接。数据结构和算法必知必会的个代码实现。 showImg(https://segmentfault.com/img/bVbvpYZ); 前言 算法为王。想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手;只有内功深厚者,前端之路才会走得...
摘要:常见的内部排序算法有插入排序希尔排序选择排序冒泡排序归并排序快速排序堆排序基数排序等。用一张图概括归并排序英语,或,是创建在归并操作上的一种有效的排序算法,效率为。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:常见的内部排序算法有插入排序希尔排序选择排序冒泡排序归并排序快速排序堆排序基数排序等。用一张图概括归并排序英语,或,是创建在归并操作上的一种有效的排序算法,效率为。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:常见的内部排序算法有插入排序希尔排序选择排序冒泡排序归并排序快速排序堆排序基数排序等。用一张图概括归并排序英语,或,是创建在归并操作上的一种有效的排序算法,效率为。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...
摘要:快速排序是不稳定的排序算法。浏览器的实现不同有什么影响排序算法不稳定有什么影响举个例子某市的机动车牌照拍卖系统,最终中标的规则为按价格进行倒排序相同价格则按照竞标顺位即价格提交时间进行正排序。 本文要解决的问题 1、找出 Array.prototype.sort 使用的什么排序算法 2、用一种直观的方式展示 Array.prototype.sort 的时间复杂度,看看它有多快? 3、...
摘要:摘要是如何回收内存的深入浅出系列深入浅出第课箭头函数中的究竟是什么鬼深入浅出第课函数是一等公民是什么意思呢深入浅出第课什么是垃圾回收算法最近垃圾回收这个话题非常火,大家不能随随便便的扔垃圾了,还得先分类,这样方便对垃圾进行回收再利用。 摘要: JS是如何回收内存的? 《JavaScript深入浅出》系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? Jav...
阅读 1236·2021-09-22 15:18
阅读 2565·2021-09-22 15:17
阅读 2204·2019-08-30 15:55
阅读 1527·2019-08-30 15:54
阅读 1012·2019-08-30 13:12
阅读 597·2019-08-30 13:12
阅读 1652·2019-08-29 11:33
阅读 1413·2019-08-26 17:04