JS实现 数组 全排

来源:互联网 发布:mpu9250好用的源码 编辑:程序博客网 时间:2024/06/07 02:42

最近面试的时候遇到了数组全排的问题

问题如下

假设有一个集合 [‘foo’, ‘bar’, ‘hello’, ‘world’],求这个集合里单词组合起来的所有不同的结果,比如:
foobarhelloworld
barfoohelloworld

相信很多宝宝都遇到过类似的笔试题,天下程序员是一家,前端也要精于算法,才能走的长远,所以要
♪ hustle hustle hustle
♪ hustle hustle everyday
♪ hustle hustle hustle
♪ hustle hustle anyway


思路:

数组 arr = [‘a’, ‘b’, ‘c’]
如果我有一个数组[‘a’, ‘b’] 然后遍历arr 找到不在[‘a’, ‘b’] 的元素,将这个元素加入 就得到了 arr
那么后退一步,
如果我有一个数组[‘a’] 然后遍历arr, 找到不在[a’,] 中的元素,将这个元素加入 就得到了 [‘a’, ‘b’] ,或 [‘a’, ‘c’]
….
如果我有一个数组[] 然后遍历arr 找到不在 []中的元素,将这个元素加入 就得到了 [‘a’] 或 [‘b’] 或 [‘c’]

我们要写一个函数,实现图片上的调用
这里写图片描述
代码如下:

var arr = ['foo','bar','hello','world'];    var count = 1;    function getStr(a){        for (var i = 0; i < arr.length; i++) {            // indexOf 是es6数组的方法,如果不存在返回-1,存在返回下标            if(a.indexOf(arr[i])<0){                //数组 a 中不存在 arr[i],将arr[i]添加到数组末尾                a.push(arr[i]);                if(a.length==arr.length){                    console.log(count++ + ': ' +a.join(""));                    }else{                    //结束一次for循环  进行了4次递归 getStr(['foo']) getStr(['bar']) getStr(['hello']) getStr(['world'])                     getStr(a);                }                //一定从数组 a 中删除arr[i],进行下次循环,如果不删除就只能获得一种结果了                a.pop();                        }       }    getStr([])      

除去注释只用了15行代码,通过上面的方法 我们实现了单个数组全排
更多方法阅读

思考问题:

如何实现多个数组全排呢?
hustle hustle hustle o(╯□╰)o