朋友面试的时候一道面试题,感觉挺有意思的就来实现下。
首先我们来题目的意思是用abc排4个数,然后只能有2个数重复,有多少种排法?
比如:abca,abcb,abcc,acba要形成这样的4位数,我们可以在abc中插入a或者b或者c;达到aabc,abac,abca。
思路有了,下面来看看怎么实现。我们首先需要知道abc在不重复的情况下能够组合几种,abc,acb,bac,bca,cab,cba;6种模式。
然后遍历原数据abc,依次获取a或b或c,插入到已经的几种混排的方式中国,因为我们要形成4位数,所以我们遍历4次,插入的位置依次为0,1,2,3.
但是因为 abc,在0的位置插入a,和1的位置插入a,都是aabc,所有有些会是重复的,用new Set()来去重。最后输出结果。方法有了下面我们来看看代码怎么实现
//初始变量let array=[]; //输出数组let str='abc'; //原数据let len=4; //排列的位数let b=str.split(''); //把原数据变为数组let cross=conversion(permutate(str)).length; //获取原数据交叉的不重复的数组
使用递归处理字符串有多少种交叉方式
/** * * * @param {any} str //'abc' * @returns */function permutate(str){ var result=[]; if(str.length==1){ return [str] }else{ var preResult=permutate(str.slice(1)); for(var j=0;j
把数据转化
function conversion(len){ let result=[]; for(var i=0;i
for(var e=0;e
console.log(new Set(array)); //去除重复添加的数据Set { 'a,a,b,c', 'a,b,a,c', 'a,b,c,a', 'b,a,b,c', 'a,b,b,c', 'a,b,c,b', 'c,a,b,c', 'a,c,b,c', 'a,b,c,c', 'b,a,a,c', 'b,a,c,a', 'b,b,a,c', 'b,a,c,b', 'c,b,a,c', 'b,c,a,c', 'b,a,c,c', 'b,c,a,a', 'b,b,c,a', 'b,c,b,a', 'b,c,a,b', 'c,b,c,a', 'b,c,c,a', 'a,a,c,b', 'a,c,a,b', 'a,c,b,a', 'a,c,b,b', 'c,a,c,b', 'a,c,c,b', 'c,a,a,b', 'c,a,b,a', 'c,b,a,b', 'c,a,b,b', 'c,c,a,b', 'c,b,a,a', 'c,b,b,a', 'c,c,b,a' }console.log(new Set(array).size); //返回数组的长度 36
主要的是思路是在数据中插入一个数据,围绕这个来扩展开来。也希望大家指点错误,最后也希望大家喜欢,可以加入qq群439667347,大家一起讨论,一起进步,后续更新中...