当前位置: 首页 > article >正文

LeetCode全排列2(js简单快通法)

题目描述

给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]
输出:

[[1,1,2],
 [1,2,1],
 [2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

解题思路

使用 全排列 函数生成所有排列,然后去重以得到最终结果

代码

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permuteUnique = function(nums) {
    const result = [];
            if (nums.length === 1) {
                return [nums];
            } else {  //遍历每一项
                for (let i = 0; i < nums.length; i++) {
                    let first = nums[i];   //拿到当前的元素
                    let left = nums.slice(0, i).concat(nums.slice(i + 1));  //除当前元素的其他元素组合
                    let rest = permuteUnique(left);     //上一次递归返回的全排列
                    for (let j = 0; j < rest.length; j++) {    //组合在一起
                        let next = [first].concat(rest[j]);
                        result.push(next);
                    }
                }
            }
            // 将数组中的每个排列转换为字符串形式
            const stringArr = result.map(arr => arr.join(','));
            // 使用 Set 进行去重
            const uniqueSet = new Set(stringArr);
           // 先将 Set 转换为数组,然后使用 map 函数将字符串数组转换回数字数组
            const uniqueArr = Array.from(uniqueSet, str => str.split(',').map(Number));
        return uniqueArr;
};

知识点

Array.from() 是 JavaScript 中的一个静态方法,它用于从类数组或可迭代对象创建一个新的数组实例。这个方法非常有用,因为它提供了一种简便的方式来将各种集合或看起来像数组的对象转换成真正的数组。

基本用法

const arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};

const actualArray = Array.from(arrayLike);
// actualArray 将会是 ['a', 'b', 'c']

在上面的例子中,arrayLike 是一个类似于数组的对象,它具有索引属性和 length 属性。使用 Array.from() 可以创建一个新的数组,其中包含了 arrayLike 中的元素。

带映射函数的用法

Array.from() 还可以接受一个映射函数作为第二个参数,这个函数会在创建新数组的过程中被调用,用于转换每个元素。

const arrayLike = {
    '0': 1,
    '1': 2,
    '2': 3,
    length: 3
};

const actualArray = Array.from(arrayLike, item => item * 2);
// actualArray 将会是 [2, 4, 6]

在这个例子中,映射函数 item => item * 2 被应用于 arrayLike 的每个元素,将每个数字乘以 2。

Set 创建数组

当你有一个 Set 对象并希望将其转换为数组时,Array.from() 是一个非常合适的选择。

const set = new Set(['a', 'b', 'c']);
const array = Array.from(set);
// array 将会是 ['a', 'b', 'c']

Map 创建数组

同样,Array.from() 也可以从 Map 对象的键或值创建数组。

const map = new Map([['key1', 'value1'], ['key2', 'value2']]);
const keys = Array.from(map.keys());
const values = Array.from(map.values());
// keys 将会是 ['key1', 'key2']
// values 将会是 ['value1', 'value2']

Array.from() 是 JavaScript 中处理集合和数组转换的非常强大的工具,它的灵活性和易用性使其成为日常编程中常用的方法之一。


http://www.kler.cn/news/284632.html

相关文章:

  • 深入探索:Windows Edge对CSS Grid布局Subgrid特性的支持与实践
  • 猫头虎分享:Python库 TensorFlow 的简介、安装、用法详解入门教程
  • 数据库中utf8mb4_unicode_520_ci较之utf8mb4_unicode_ci 具体增加了哪些特性
  • js插件-模糊搜索、自动补全下拉框
  • P2036 [COCI2008-2009 #2] PERKET
  • 关于一个早期对电子辐射的小讨论
  • Eureka
  • 图像去噪评论:从经典到最先进的方法
  • Java集合——list
  • 【数学建模学习手册】python基本入门使用
  • Altium Designer24使用
  • 开发团队如何应对突发的技术故障和危机
  • Nginx运维规范及安全配置
  • NoSQL数据库-Redis集群详解及案例实现
  • 【解决】sql中包含问号(?),导致mybatis解析错误
  • 使用 @Configuration 和 @Bean 注解替代 XML 配置文件
  • 使用pgdump、pgrestore迁移数据表到docker部署的postgis
  • Oracle数据库大小写问题注意点
  • 57基于SpringBoot+Vue+uniapp的洗衣店订单管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • Spring Boot 框架中配置文件 application.properties 当中的所有配置大全
  • React教案
  • 关于报错 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“ 的可能原因
  • 软件测试面试八股文
  • LeetCode面试题Day18|LC61 旋转链表
  • 【web开发】Spring Boot 快速搭建Web项目(二)
  • Getting RateLimitError while implementing openai GPT with Python
  • openshift node NotReady kubelet http: TLS handshake error
  • SAP 有趣的‘bug‘ 选择屏幕输入框没了
  • 应用案例|亚克力板CNC加工自动化上下料
  • (四)进入MySQL 【事务】