Flatten Nested Arrays(展平嵌套数组)
这个题目是在一个公司现场面谈的时候的一个题目。虽然对这种找工作上来就做题目的现象比较反感。
但是大环境如此,也只能被蹂躏了。
中文描述
题目要求比较简单:[1,2,[3],[[4]],5,6] -> [1,2,3,4,5,6]
就是数组中嵌套数组,考察一个数组[1,2,[3],[[4]],5,6]。 你怎么能够输出 1,2,3,4,5,6(并不要求按照顺序输出)。
这里是一个嵌套数组,你需要将这个数组中的值全部取出来。
思路和点评
不清楚其他语言中这个数据结构怎么存储,我假设的是在 Java 中存储的对象。
可以采用队列的方式来实现,例如,在 Java 中存储了整数,1, 2, 对象,[3] 为一个数组对象。
你可以先遍历一次 List,将所有的 List 的对象都压入队列中,然后进行出队。
在出队时候,判断对象是否为整数对象,如果是整数对象,就输出,如果不是整数对象,然后将数组对象继续进行遍历,然后压入队列,然后再出队。
在这里讨论的问题比较多,还有 [[[2]5]] 这种多层嵌套的问题。
经过网站上的考古,这里有 2 个方法可以更快的实现。1 是递归的方法,2 是 利用 Java 8 的 Stream 特性。
在写测试代码之前,你需要明白下数据结构的定义,要不然你没有办法测试。在 Java 中你可以定义为对象数组,如下:
Object[] array = {
1
,
2
,
new
Object[] {
3
,
4
,
new
Object[] {
5
,
new
Object[] {
new
Object[] {
6
} } },
7
},
8
,
9
,
10
};
然后可以利用递归,在对对象数组进行遍历的时候,如果你遇到了对象,那么你需要再次调用你的方法,对对象中的内容进行遍历,如果这个时候已经没有对象了,可以返回第二层遍历的结果,并且插入到上层 List 列表中。
如果你使用的 Java 8 的 Stream,你需要对 Stream 的使用和方法比较了解才可以。这里也涉及到了递归,只是写法有点不同罢了。
还有一个更加简单粗暴的方法,当然我不认为这个方法是出题人希望考察的目标,在 Java 中你可以将数组直接转换成 String 字符串进行输出,比如说上面的对象队列,你可以转换为: [1, 2, [3, 4, [5, [[6]]], 7], 8, 9, 10]
字符串进行输出,然后使用 Java 的 Split 函数,进行按照逗号拆分后,然后将多余 [ 和 ] 符号去掉,然后再将内容重新放回 List。 这个有点简单粗暴,但是也一样能够达到目的。
源代码
源代码和有关代码的更新请访问 GitHub:
https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/PillPackTest.java
测试类请参考:
https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/PillPackTest.java
代码思路请参考:
package com.ossez.codebank.interview.tests;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** PillPack* * <pre>* https://www.cwiki.us/display/ITCLASSIFICATION/Flatten+Nested+Arrays* </pre>* * @author YuCheng**/
public class PillPackTest {private final static Logger logger = LoggerFactory.getLogger(PillPackTest.class);List<Integer> returnList = new ArrayList<Integer>();/*** https://www.cwiki.us/display/ITCLASSIFICATION/Flatten+Nested+Arrays* * FlattenNestedArrays*/@Testpublic void testFlattenNestedArrays() {logger.debug("Test FlattenNestedArrays");Object[] array = { 1, 2, new Object[] { 3, 4, new Object[] { 5, new Object[] { new Object[] { 6 } } }, 7 }, 8, 9, 10 };logger.debug("LOOP: {} - > {}", Arrays.deepToString(array), Arrays.toString(loopFlatten(array)));logger.debug("Java 8: {} - > {}", Arrays.deepToString(array), Arrays.toString(java8Flatten(array).toArray()));}/*** Loop And Recursive* * @param inputArray* @return* @throws IllegalArgumentException*/private static Integer[] loopFlatten(Object[] inputArray) throws IllegalArgumentException {// NULL CHECKif (inputArray == null)return null;List<Integer> flatList = new ArrayList<Integer>();for (Object element : inputArray) {if (element instanceof Integer) {flatList.add((Integer) element);} else if (element instanceof Object[]) {// RecursiveflatList.addAll(Arrays.asList(loopFlatten((Object[]) element)));} else {throw new IllegalArgumentException("Input must be an array of Integers or nested arrays of Integers");}}return flatList.toArray(new Integer[flatList.size()]);}/*** Java 8 Stream to Flatten array.* * @param array* @return*/private static Stream<Object> java8Flatten(Object[] array) {// int[] flatInt = java8Flatten(array).mapToInt(Integer.class::cast).toArray();return Arrays.stream(array).flatMap(o -> o instanceof Object[] ? java8Flatten((Object[]) o) : Stream.of(o));}}
测试结果
上面程序的测试结果如下:
2018/12/27 13:39:22 DEBUG [com.ossez.codebank.interview.tests.PillPackTest] - Test FlattenNestedArrays
2018/12/27 13:39:22 DEBUG [com.ossez.codebank.interview.tests.PillPackTest] - LOOP: [1, 2, [3, 4, [5, [[6]]], 7], 8, 9, 10] - > [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2018/12/27 13:39:22 DEBUG [com.ossez.codebank.interview.tests.PillPackTest] - Java 8: [1, 2, [3, 4, [5, [[6]]], 7], 8, 9, 10] - > [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Flatten Nested Arrays(展平嵌套数组)相关推荐
- Python/numpy之ravel()多维数据展平函数
Python/numpy之ravel()多维数据展平函数 可参考官方文档numpy.ravel或末尾摘抄内容 ravel()将多维数据展平为一维数据,可以选择不同的数据索引方式(见文档参数四个可选值) ...
- Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序、获取交集元素及其索引、如果输入数组不是一维的,它们将被展平(flatten),然后计算交集
Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序.获取交集元素及其索引.如果输入数组不是一维的,它们将被展平(flatten),然后计算交集 目录
- 展平数组(flatten、ravel)--numpy
1. flatten()函数 1.1 函数功能 返回将输入数组展平成一维的副本数组,生成的新数组是原数组的深层拷贝(copy),两个数组相互独立,对新数组的修改不会影响原数组 1.2 函数语法 nda ...
- js算法数组flat展平的几种方法
数组的展平,主要是指的是数组嵌套数组转为一维数组,总结了一下几种方法 es6原生的方法 链接: es6中的flat let arr = [1, 2, [3, 4]].flat() console.lo ...
- pytorch Flatten展平
经过测试,cpu模式中,用Module的方式比直接在推理中展平平均快1~5ms from torch import nn import torch import mathclass Flatten(M ...
- sql 数组三 展平数组
展平数组 如需将 ARRAY 转换为一组行(即执行展平操作),请使用 UNNEST 运算符.UNNEST 获取一个 ARRAY,然后返回一个表,ARRAY 中的每个元素均占该表的一行. 由于 UNNE ...
- Python数据处理Tips多层嵌套Json数据展平到DataFrame
在工作中需要处理嵌套数据(尤其是无模式的 MongoDB 日志等)或者是网络爬虫抓取下来的多层嵌套数据需要展平处理. 如果将它放在 BigQuery 中则很容易通过使用 WITHIN 等的查询将其更改 ...
- python学习笔记之-展平函数ravel和flatten及两者的区别
ravel()和flatten()是将多维数据展平为一维数据,功能相同,区别在于一个是引用操作,一个是复制操作.ravel()展平数据后,修改后面的数据会影响前面的数据,而flatten()展平数据后 ...
- sql 查询嵌套数组
查询嵌套数组 如果一个表包含 STRUCT 的 ARRAY,则可展平 ARRAY 以查询 STRUCT 的字段.您也可以展平 STRUCT 值的 ARRAY 类型字段. 查询 ARRAY 中的 STR ...
最新文章
- java将输出结果写入csv文件_如何在Java中将数据写入.csv文件?
- 41 岁的黄峥辞任拼多多董事长一职,未来将投身于科学研究!
- 基于tcpdump的Android智能移动终端数据包捕获完整解决方案
- python基础教程视频教程百度云-Python零基础入门学习视频教程全42集百度云网盘下载...
- 【Camera专题】Qcom-高通OTP完全调试指南-上
- matlab 图像函数以及运用(第十章)
- TeXLive2019 安装(亲测有效)
- spring 配置文件模板
- torch.cuda.is_available(),torch.cuda.device_count(),torch.cuda.get_device_name(0)
- javascript:鼠标拖动图标技术
- 纹理——灰度共生矩阵公式及代码
- 计算机矢量图的优点,矢量图与位图的区别,各自的优缺点……
- 一套精美的私服发布网,适用任何游戏发布
- SaaS模式和传统软件模式有什么区别?
- linux终端中文方块,Linux终端界面显示中文乱码或方块
- 什么是APS系统?APS系统和ERP系统的区别是什么?
- vue+elementUI+后端springboot多用户评论、回复、点赞
- 汽车电子学习【车载网络CAN/LIN】
- AES - Openssl AES 函数说明
- 273 块钱购入的域名,值了
热门文章
- android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)
- pandas 遍历 series
- 解决Linux最大进程数和最大文件句柄问题
- Windows和Linux的C/C++ IDE选择
- 苏州大学计算机科学与技术研究生分数线,【图片】18年苏州大学计算机872考研经验分享【苏州大学研究生吧】_百度贴吧...
- [Spring 深度解析]第2章 Spring基础
- Android之SurfaceView(二)
- java 鸡兔统统_Java内存泄露介绍
- umi3 如何管理model_django admin 管理工具
- 服务器打印文档 图片显示是叉,Lodop背景图无图片时显示放大叉号问题