每天一道面试题---全排列

89 阅读1分钟

题目描述

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

思路

假设第一个测试用例为nums = [1]

那么最终的结果 result = [[1]]

第二个测试用例为nums = [1,2]

那么结果 result = [[2,1],[1,2]]

如果说看到这里还没有发现规律的话,可以看看下面思路

假设我们的测试值为1,2,3

一开始取一个值出来进行排列 1

那么排列之后的结果就是[[1]]

这个时候我们再取一个值2,在前面排列的基础上再排列

这个时候就是不断的调整2的位置,这个2可以在1的前面,也可以在1的后面

image.png

经过排列之后的结果就是[[2,1],[1,2]]

这个时候再将3也加入进来

image.png

image.png

得到最终结果

代码

const fn = (nums) =>{
	let result = [[nums[0]]]
	for(let i = 1;i<nums.length;i++){ //这个循环遍历nums 
	        console.log(nums[i]);
		let temp = []
		for(let j=0;j<result.length;j++){//这个循环遍历result
			console.log(result[j]);
			for(let n=0;n<=result[0].length;n++){
				let arr = [...result[j]]
				arr.splice(n,0,nums[i])
				console.log(arr);
				temp.push(arr)
			}
		}
		result = temp	
	}
	console.log(result)
	return result
}