2610. 转换二维数组
Posted lxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2610. 转换二维数组相关的知识,希望对你有一定的参考价值。
题目链接:2610. 转换二维数组
方法:哈希表
解题思路
统计\\(nums\\)中每个元素的数量,然后每行输出其中的\\(1\\)个,直到元素全部输出。
代码
class Solution
public:
vector<vector<int>> findMatrix(vector<int>& nums)
int n = nums.size();
vector<int> cnt(n + 1); // 统计数量
for (auto &num : nums) cnt[num] ++ ;
vector<vector<int>> ans;
int flag = n;
while (flag)
vector<int> level; // 输出当前行
for (int i = 1; i <= n; i ++ )
if (cnt[i] != 0) // 输出1个
level.push_back(i);
cnt[i] -- ;
flag -- ;
ans.push_back(level);
return ans;
;
复杂度分析
时间复杂度:\\(O(Cn),C = nums中最多的元素数量\\);
空间复杂度:\\(O(n)\\)。
将二维数组转换为一维数组,交替其值
【中文标题】将二维数组转换为一维数组,交替其值【英文标题】:Convert a bidimensional array to a 1D array alternating their values 【发布时间】:2018-11-02 23:50:17 【问题描述】:我有一个这样的二维数组:
let test2d = [
["foo", "bar"],
["baz", "biz"]
]
如果我想将此二维数组转换为一维数组(不改变它们的值),我可以通过两种方式实现:
第一种方式:
let merged = test2d.reduce( (prev, next) => prev.concat(next) )
console.log(merged) // ["foo", "bar", "baz", "biz"]
第二种方式:
let arr1d = [].concat.apply([], test2d)
console.log(arr1d) // ["foo", "bar", "baz", "biz"]
问题:我怎样才能得到一个一维数组,但它们的值是交替的?我的意思是这样的:
["foo", "baz", "bar", "biz"]
【问题讨论】:
【参考方案1】:您可以使用此处定义的zip
函数:Javascript equivalent of Python's zip function
let zip= rows => rows[0].map((_,c)=>rows.map(row=>row[c]))
所以你可以调用:
let arr1d = [].concat.apply([], zip(test2d))
这是完整的代码:
let test2d = [ ["foo", "bar"], ["baz", "biz"] ]
let zip = rows => rows[0].map((_, c) => rows.map(row => row[c]))
let arr1d = [].concat.apply([], zip(test2d))
console.log(arr1d)
【讨论】:
这个很优雅!谢谢你的回答。【参考方案2】:您可以为每个索引获取一个数组,并在最后连接数组。
var array = [["foo", "bar"], ["baz", "biz"]],
result = [].concat(...array.reduce((r, a) =>
a.forEach((v, i) => (r[i] = r[i] || []).push(v));
return r;
, []));
console.log(result);
【讨论】:
嗨@NinaScholz,如果你不介意你能详细说明(r[i] = r[i] || []).push(v)
吗?我一直遵循您的解决方案,直到那行代码丢失
你可以写两行代码:r[i] = r[i] || [];
和r[i].push(v)
。第一行检查r[i]
是否为真,就像一个数组,如果不是,它将一个数组作为assingment。第二个将项目推送到此数组。【参考方案3】:
为什么不使用常规的 for 循环?这是高效且易于阅读的。
var arr1d = [];
for (let i = 0; i < test2d[0].length; i++)
for (let j = 0; j < test2d.length; j++)
arr1d.push(test2d[j][i]);
【讨论】:
这个解决方案也有效,即使有更多的行和列。谢谢!【参考方案4】:这个解决方案很容易理解,它只是使用嵌套的 for 循环来获得所需的输出:
var data = []; // This will be the new array
let test2d = // This is your 2D array
[
["foo", "bar"],
["baz", "biz"]
]
// Here we use nested for-loops to add the items to data[] in the desired order
for(var i = 0; i < test2d.length; i++)
for(var j = 0; j < test2d[0].length; j++)
data.push(test2d[j][i]);
console.log(data); // Print the output :)
data 数组现在等于:[ "foo", "baz", "bar", "biz" ]
希望这有帮助!
【讨论】:
感谢您的回答,但此解决方案仅适用于我的test2d
数组,但如果我向数组中添加更多行和列,它就不起作用。为什么?因为诀窍是从列 (test2d[0].length
) 而不是行 (test2d.length
) 开始循环。查看 patstuart 的答案。以上是关于2610. 转换二维数组的主要内容,如果未能解决你的问题,请参考以下文章
PHP二维数组转换成一维数组,一个变量多个二维数组转换成一维数组,PHP二维数组(或任意维数组)转换成一维数组的方法汇总,array_reduce(); array_walk_recursive()