LeetCode原题: 46题 全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
题目的意思是传入一个数字数组,要得到他所有的排列的数, 遇到全排列问题, 固定思路: 递归回溯!
/**
* // Definition for a Node.
* function Node(val, next, random) {
* this.val = val;
* this.next = next;
* this.random = random;
* };
*/
const Permute = (nums) => {
let res = []
let used = []
__getPermute(nums, [], used, res)
return res
}
/*
* nums 存放着 可以排列的数字 集合数组
* temp 存放着 每次符合 排列结果的数组
* used 存放着当前 数字是否被使用过 是一个 bool型数组
* res 用来存放 结果的数组
*/
function __getPermute(nums, temp, used, res) {
if (temp.length === nums.length) //如果暂存的数字达到三位,则代表是一种结果,就要保存
return res.push(+temp.join('')) // 把数组转化为字符串,并用+号强制类型转换为数字
for (let i = 0; i < nums.length; i++) { //开始循环
if (!used[i]) { // 因为要不重复,所以要确保这个数字没有被使用过才能存入结果中
temp.push(nums[i]) // 没有被使用过, 则可以进入排列,push进排列数组
used[i] = true // 因为push 排列数组了被使用过了, 把当前数字记录为已经使用过
__getPermute(nums, temp, used, res) // 进入递归
temp.pop() // 往下的递归结束了也就相当于得到并且记录了这个值的所有排列,要换别的数字了 把 先前 push的 数字弹出
used[i] = false // 把数字弹出后, 当前数字就应该记录为没有使用过
}
}
}
面试题:
tcp 三次握手和四次挥手 ?