这个题目是在一个公司现场面谈的时候的一个题目。虽然对这种找工作上来就做题目的现象比较反感。

但是大环境如此,也只能被蹂躏了。

中文描述

题目要求比较简单:[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 = { 12new Object[] { 34new Object[] { 5new Object[] { new Object[] { 6 } } }, 7 }, 8910 };

然后可以利用递归,在对对象数组进行遍历的时候,如果你遇到了对象,那么你需要再次调用你的方法,对对象中的内容进行遍历,如果这个时候已经没有对象了,可以返回第二层遍历的结果,并且插入到上层 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(展平嵌套数组)相关推荐

  1. Python/numpy之ravel()多维数据展平函数

    Python/numpy之ravel()多维数据展平函数 可参考官方文档numpy.ravel或末尾摘抄内容 ravel()将多维数据展平为一维数据,可以选择不同的数据索引方式(见文档参数四个可选值) ...

  2. Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序、获取交集元素及其索引、如果输入数组不是一维的,它们将被展平(flatten),然后计算交集

    Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序.获取交集元素及其索引.如果输入数组不是一维的,它们将被展平(flatten),然后计算交集 目录

  3. 展平数组(flatten、ravel)--numpy

    1. flatten()函数 1.1 函数功能 返回将输入数组展平成一维的副本数组,生成的新数组是原数组的深层拷贝(copy),两个数组相互独立,对新数组的修改不会影响原数组 1.2 函数语法 nda ...

  4. js算法数组flat展平的几种方法

    数组的展平,主要是指的是数组嵌套数组转为一维数组,总结了一下几种方法 es6原生的方法 链接: es6中的flat let arr = [1, 2, [3, 4]].flat() console.lo ...

  5. pytorch Flatten展平

    经过测试,cpu模式中,用Module的方式比直接在推理中展平平均快1~5ms from torch import nn import torch import mathclass Flatten(M ...

  6. sql 数组三 展平数组

    展平数组 如需将 ARRAY 转换为一组行(即执行展平操作),请使用 UNNEST 运算符.UNNEST 获取一个 ARRAY,然后返回一个表,ARRAY 中的每个元素均占该表的一行. 由于 UNNE ...

  7. Python数据处理Tips多层嵌套Json数据展平到DataFrame

    在工作中需要处理嵌套数据(尤其是无模式的 MongoDB 日志等)或者是网络爬虫抓取下来的多层嵌套数据需要展平处理. 如果将它放在 BigQuery 中则很容易通过使用 WITHIN 等的查询将其更改 ...

  8. python学习笔记之-展平函数ravel和flatten及两者的区别

    ravel()和flatten()是将多维数据展平为一维数据,功能相同,区别在于一个是引用操作,一个是复制操作.ravel()展平数据后,修改后面的数据会影响前面的数据,而flatten()展平数据后 ...

  9. sql 查询嵌套数组

    查询嵌套数组 如果一个表包含 STRUCT 的 ARRAY,则可展平 ARRAY 以查询 STRUCT 的字段.您也可以展平 STRUCT 值的 ARRAY 类型字段. 查询 ARRAY 中的 STR ...

最新文章

  1. java将输出结果写入csv文件_如何在Java中将数据写入.csv文件?
  2. 41 岁的黄峥辞任拼多多董事长一职,未来将投身于科学研究!
  3. 基于tcpdump的Android智能移动终端数据包捕获完整解决方案
  4. python基础教程视频教程百度云-Python零基础入门学习视频教程全42集百度云网盘下载...
  5. 【Camera专题】Qcom-高通OTP完全调试指南-上
  6. matlab 图像函数以及运用(第十章)
  7. TeXLive2019 安装(亲测有效)
  8. spring 配置文件模板
  9. torch.cuda.is_available(),torch.cuda.device_count(),torch.cuda.get_device_name(0)
  10. javascript:鼠标拖动图标技术
  11. 纹理——灰度共生矩阵公式及代码
  12. 计算机矢量图的优点,矢量图与位图的区别,各自的优缺点……
  13. 一套精美的私服发布网,适用任何游戏发布
  14. SaaS模式和传统软件模式有什么区别?
  15. linux终端中文方块,Linux终端界面显示中文乱码或方块
  16. 什么是APS系统?APS系统和ERP系统的区别是什么?
  17. vue+elementUI+后端springboot多用户评论、回复、点赞
  18. 汽车电子学习【车载网络CAN/LIN】
  19. AES - Openssl AES 函数说明
  20. 273 块钱购入的域名,值了

热门文章

  1. android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)
  2. pandas 遍历 series
  3. 解决Linux最大进程数和最大文件句柄问题
  4. Windows和Linux的C/C++ IDE选择
  5. 苏州大学计算机科学与技术研究生分数线,【图片】18年苏州大学计算机872考研经验分享【苏州大学研究生吧】_百度贴吧...
  6. [Spring 深度解析]第2章 Spring基础
  7. Android之SurfaceView(二)
  8. java 鸡兔统统_Java内存泄露介绍
  9. umi3 如何管理model_django admin 管理工具
  10. 服务器打印文档 图片显示是叉,Lodop背景图无图片时显示放大叉号问题