壹 ❀ 引

今天是过完年到公司的第二天,年前因为封版,到今天我们小组是第一个发版的组,然后就各种踩坑,到现在还在公司等运维解决jenkins问题,闲着也是闲着,做一道算法题,简单记录下解题思路,本题来自LeetCode566. 重塑矩阵,描述如下:

在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。

给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。

如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例 1:

输入:
nums =
[[1,2],
[3,4]]
r = 1, c = 4
输出:
[[1,2,3,4]]
解释:
行遍历nums的结果是 [1,2,3,4]。新的矩阵是 1 * 4 矩阵, 用之前的元素值一行一行填充新矩阵。

示例 2:

输入:
nums =
[[1,2],
[3,4]]
r = 2, c = 4
输出:
[[1,2],
[3,4]]
解释:
没有办法将 2 * 2 矩阵转化为 2 * 4 矩阵。 所以输出原矩阵。

注意:

  1. 给定矩阵的宽和高范围在 [1, 100]。
  2. 给定的 r 和 c 都是正数。

贰 ❀ 简单的题解

题目不难理解,给定一个二维数组,将其转换成一个包含r个数组,且每个数组包含c个元素的新数组。比如例子1中,就是将原数组转为包含1个数组且数组元素为4个的新数组。

需要注意的是,也可能存在转换失败的情况,比如例子2,原数组一共就只有4个元素,而期望是转成包含2个数组,且每个数组包含4个元素的新数组,数量超过了原数组元素数量,转换失败时期望返回原数组。

因此我们可以得知,不管怎么转换,转换之后的数组元素一定得跟原数组保持一次,只要数量不相同则说明不符合转换规则,返回原数组即可。

所以最简单的思路就是将原数组进行降维,将其变为一维数组,之后执行r次裁剪操作,每次裁剪c个元素构成一个子数组,将其加入到需要返回的新数组中即可。

直接上代码:

/**
* @param {number[][]} nums
* @param {number} r
* @param {number} c
* @return {number[][]}
*/
var matrixReshape = function (nums, r, c) {
// 先判断处理之后的数组长度是否跟之前相等
// 小知识,不管几维数组,转字符串后再还原成数组都可以做到降维的效果
let arr = nums.join().split(',');
if (arr.length !== r * c) {
return nums;
};
// 现在要做的就是执行r次裁剪操作,每次取c个元素组成一个子数组,并加入到新数组
const res = [];
for(let i = 0;i < r;i++){
// splice会修改原数组,因此我们每次都从0开始裁剪c个是完全没问题的
res.push(arr.splice(0,c));
}
return res;
};

叁 ❀ 数组降维几种方式

在做这道题之前,我理解的数组降维最直观的做法就是使用flat。flat接受一个数组并对其做降维操作,默认只降维一层,比如:

// 这是一个二维数组
let arr = [[1],[2]];
// 默认降维一次,因为会得到一个一维数组
let arr_ = arr.flat();
// 返回一个新数组,不会修改原数组
arr//[[1],[2]]
arr_//[1,2]

flat并不会修改原数组,而是在降维后返回一个新数组。falt可以接受一个参数,表示你希望降维的次数,比如我们有一个三维数组,想降成一维,传递的参数就应该是2:

[1,[2,[3]]].flat(2);//[1,2,3]

但事实上,我们可能要做降维操作,但不知道数组是几维,因此可以传递传输为Infinity,这样不管是几维,都将得到一个新的一维数组:

[[[[[1]]]]].flat(Infinity);//[1]

当然,我们可以自己模拟实现一个flat,比如这样:

function flat_(arr) {
if (!Array.isArray(arr)) {
throw new Error('The argument must be an array.');
};
return arr.reduce((accumulator, currentValue) => {
return accumulator.concat(Array.isArray(currentValue) ? flat_(currentValue) : currentValue);
}, []);
};

而在今天做了这道题之后,我发现原来将数组转为字符串,再还原成数组也能做到数组降维的操作,比如

([1,[2],[3,[4]]]+'').split(',')// [1,2,3,4]

而这里的原理仅仅是用了数组与字符串相加的隐式转换。同理,join也能将数组还原成字符,因此下面这段代码拥有相同效果:

[1,[2],[3,[4]].join().split(',')// [1,2,3,4]

马上11点了,发版也完成了,那么本文结束,下班下班!

JS LeetCode 566. 重塑矩阵题解分析,数组降维的几种方式的更多相关文章

  1. LeetCode 566. 重塑矩阵(Reshape the Matrix)

    566. 重塑矩阵 566. Reshape the Matrix 题目描述 LeetCode LeetCode LeetCode566. Reshape the Matrix简单 Java 实现 c ...

  2. Java实现 LeetCode 566 重塑矩阵(遍历矩阵)

    566. 重塑矩阵 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表 ...

  3. leetcode 566. 重塑矩阵 c++ 实现

    1.问题描述: 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想 ...

  4. java中数组复制的两种方式

    在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...

  5. 数组复制的五种方式(遍历循环一一赋值、System.arraycopy、地址赋值、克隆clone()、Arrays.copyof())

    package com.Summer_0424.cn; import java.util.Arrays; import java.util.concurrent.CopyOnWriteArrayLis ...

  6. C++ 数组遍历的两种方式

    C++ 数组遍历的两种方式: #include <iostream> using namespace std; int main() { // 一维数组 ] = {, , , , }; / ...

  7. leetcode.矩阵.566重塑矩阵-Java

    1. 具体题目 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数.重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充.如果具有给定参数的reshape操 ...

  8. 力扣566. 重塑矩阵-C语言实现-简单题

    题目 传送门 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要 ...

  9. 一步步分析Java深拷贝的两种方式-clone和序列化

    今天遇到一道面试题,询问深拷贝的两种方法.主要就是clone方法和序列化方法.今天就来分析一下这两种方式如何实现深拷贝.如果想跳过解析的朋友,直奔"重点来了!"寻找答案. clon ...

  10. 【前台 ajax】web项目前台传递数组给后台 两种方式

    项目使用maven    springMVC 有需求 将前台的数组   在ajax中 送给后台 方式1: 前台代码:[注意:ajax中的属性---traditional:true,  ] 如果Post ...

随机推荐

  1. cs 保研经验贴 | 英语口试

    很多夏令营都有英语面试环节.但这其实是有迹可循的,多说几遍就熟练了. 无论是笔试面试,还是联系导师 联系 hr,这种自我推销的事情,都会越做越熟练的.希望发表也是如此吧-(来自博零菜鸟的碎碎念-) 目 ...

  2. SV OOP-1

    内容 面向对象编程 面向对象的基本概念 对象没有办法直接操作,需要通过handle(指向对象的指针)进行操作 面向对象的基本术语 面向对象的优势 类的定义 实例化对象 new() - 产生具体对象,开 ...

  3. 有了Composition API后,有些场景或许你不需要pinia了

    前言 日常开发时有些业务场景功能很复杂,如果将所有代码都写在一个vue组件中,那个vue文件的代码量可能就几千行了,维护极其困难.这时我们就需要将其拆分为多个组件,拆完组件后就需要在不同组件间共享数据 ...

  4. EasyNetQ(RabbitMQ)在处理消息时,如果抛出异常,继续不断发送到订阅队列,不断处理(也就是不自动确认消息已到达)

    默认情况下,EasyNetQ的消息处理过程中,如果throw exception,那么,依然是认为消息已经送达,不会再次推送,为了让RabbitMQ再次推送,可以这么实现: public sealed ...

  5. [转帖]MySQL的版本情况

    Introducing MySQL Innovation and Long-Term Support (LTS) versions (oracle.com) Introducing MySQL Inn ...

  6. [转帖]金仓数据库KingbaseES分区表 -- 声明式创建分区表

    https://www.modb.pro/db/638045 1. 创建分区表同时创建分区 1.1 准备环境 # 创建分区表同时创建分区 create table tb1(id bigint,stat ...

  7. 【转帖】用pycharm开发django项目示例

    https://www.cnblogs.com/kylinlin/p/5184592.html pycharm开发django工程(一) 在pycharm(企业版)中新建Django工程,注意使用虚拟 ...

  8. [转帖]Unixbench服务器综合性能测试方法及工具下载

    UnixBench是一款开源的测试 unix 系统基本性能的工具,是比较通用的测试VPS性能的工具. UnixBench会执行一系列的测试,包括2D和3D图形系统的性能衡量,测试的结果不仅仅只是CPU ...

  9. [转载]Linux常用的可插拔认证模块(PAM)pam_limits.so、pam_rootok.so和pam_userdb.so的详解

    Linux常用的可插拔认证模块(PAM)pam_limits.so.pam_rootok.so和pam_userdb.so的详解 https://blog.51cto.com/udb1680/1846 ...

  10. vCenter 6.7 使用Grafana监控失败的处理

    背景 国庆处理的vCenter监控. 老的vCenter6.0的平台很正常. 但是新的vCenter 6.7 就经常出现断连的情况. 花费了快一个多小时才搞定, 这里记录一下. 问题现象 vCente ...