Java-使用递归展平数组

use*_*442 3 java arrays recursion

我一直在练习算法,递归总是我的弱点.此问题要求将嵌套数组展平为单个数组.如果使用给出O(n ^ 3)[给定相同大小的3d数组]解决方案的循环,这将是简单的.

然而,随着递归我一直在努力几个小时.这就是我所拥有的,请注意我已经尝试了我的代码尝试不同的解决方案,这正是我决定留下来发布给你们的人.

我想要的是两件事,无论如何要修复我当前的代码以获得正确的输出,并且有一种更简单,更简洁的方式来使用递归编写此代码,谢谢!

奖金问题,如果我不知道嵌套数组的维度,那么我将如何使用递归来解决这个问题?

编辑 好吧经过一些硬编码(我不想这样做)后,我设法让这个工作.但是代码现在是硬编码而且非常混乱,无论如何都要清理代码或者使用递归来解决这个问题的简单方法?

EDIT2 我正在尝试使用辅助方法递归重做此问题.我会看看我是否有更好的运气使用这种风格

import java.io. * ;
    import java.util. * ;
    class Solution {
    // static int oneLen = 0;
    //static int twoLen = 0;
    //static int threeLen = 0;

    static int oneCnt = 0;
            static int twoCnt = 0;
            static int threeCnt = 0;
            static ArrayList < Integer > result = new ArrayList < Integer > ();
            public static ArrayList < Integer > flatten(int [][][] arr){

    if (oneCnt < arr[threeCnt][twoCnt].length && !(oneCnt == 2 && twoCnt == 2 && threeCnt == 2))
    {


    if (oneCnt == 0 && twoCnt == 0 && threeCnt == 0){
    result.add(arr[threeCnt][twoCnt][oneCnt]);
            oneCnt++;
            result.add(arr[threeCnt][twoCnt][oneCnt]);
            System.out.println("Line One");
            System.out.println("Count1:  " + oneCnt);
            System.out.println("Count2:  " + twoCnt);
            System.out.println("Count3:  " + threeCnt);
    }
    oneCnt++;
            if (oneCnt != 3){
    result.add(arr[threeCnt][twoCnt][oneCnt]); }






    System.out.println("Line One");
            System.out.println("Count1:  " + oneCnt);
            System.out.println("Count2:  " + twoCnt);
            System.out.println("Count3:  " + threeCnt);
            flatten(arr);
    }     else if (oneCnt == arr[threeCnt][twoCnt].length && twoCnt < arr[threeCnt].length - 1){


    //oneLen = 0;    
    oneCnt = 0;
            // twoLen++;


            twoCnt++;
            result.add(arr[threeCnt][twoCnt][oneCnt]);
            System.out.println("Line Two");
            System.out.println("Count:1  " + oneCnt);
            System.out.println("Count:2  " + twoCnt);
            System.out.println("Count:3  " + threeCnt);
            flatten(arr);
    }

    else if (oneCnt == arr[threeCnt][twoCnt].length && twoCnt == arr[threeCnt].length - 1 && threeCnt < arr.length - 1){

    oneCnt = 0;
     twoCnt = 0;
            threeCnt++;
            result.add(arr[threeCnt][twoCnt][oneCnt]);
            System.out.println("Line Three");
            System.out.println("Count:1  " + oneCnt);
            System.out.println("Count:2  " + twoCnt);
            System.out.println("Count:3  " + threeCnt);
            flatten(arr);
    }
    return result;
    }
    public static void main(String[] args) {
    int[][][] array =
    {  { {1, 2, 3}, { 4, 5, 6}, { 7, 8, 9} },
    { {10, 11, 12}, {13, 14, 15}, {16, 17, 18} },
    { {19, 20, 21}, {22, 23, 24}, {25, 26, 27} } };
            flatten(array);
            for (int i = 0; i < result.size(); i++){
    System.out.print(result.get(i) + ",");
    }
    }
    }
Run Code Online (Sandbox Code Playgroud)

输出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,27,

Edit3 使用帮助器递归后我几乎得到了答案,但最后一个元素不会添加到arraylist.

import java.io. * ;
    import java.util. * ;
    class Solution {



    static ArrayList < Integer > result = new ArrayList < Integer > ();
            public static void flatten(int [][][] arr){
    int oneLen = 0;
            int twoLen = 0;
            int threeLen = 0;
            flattenHelper(arr, oneLen, twoLen, threeLen);
    }

    public static void flattenHelper(int [][][] arr, int oneLen, int twoLen, int threeLen){

    if (oneLen < arr[threeLen][twoLen].length - 1){
    System.out.println("Line One");
            System.out.println("Count:1  " + oneLen);
            System.out.println("Count:2  " + twoLen);
            System.out.println("Count:3  " + threeLen);
            result.add(arr[threeLen][twoLen][oneLen]);
            flattenHelper(arr, oneLen + 1, twoLen, threeLen);
    }
    else if (twoLen < arr[threeLen].length - 1){
    System.out.println("Line Two");
            System.out.println("Count:1  " + oneLen);
            System.out.println("Count:2  " + twoLen);
            System.out.println("Count:3  " + threeLen);
            result.add(arr[threeLen][twoLen][oneLen]);
            flattenHelper(arr, oneLen = 0, twoLen + 1, threeLen);
    }     else if (threeLen < arr.length - 1){
    System.out.println("Line Two");
            System.out.println("Count:1  " + oneLen);
            System.out.println("Count:2  " + twoLen);
            System.out.println("Count:3  " + threeLen);
            result.add(arr[threeLen][twoLen][oneLen]);
            flattenHelper(arr, oneLen = 0, twoLen = 0, threeLen + 1);
    }

    }

    public static void main(String[] args) {
    int[][][] array =
    {  { {1, 2, 3}, { 4, 5, 6}, { 7, 8, 9} },
    { {10, 11, 12}, {13, 14, 15}, {16, 17, 18} },
    { {19, 20, 21}, {22, 23, 24}, {25, 26, 27} } };
            flatten(array);
            for (int i = 0; i < result.size(); i++){
    System.out.print(result.get(i) + ",");
    }
    }
    }
Run Code Online (Sandbox Code Playgroud)

输出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,

Eri*_*nil 6

它是递归的,您不需要更改输入结构,也不需要知道数组的维度.你可以疯狂混合Arrays,Lists和其他对象,它会返回一个ArrayList:

package stackOverflow;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

public class Solution
{
    public static void main(String[] args) {
        int[][][] int3dArray = { { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } },
                { { 10, 11, 12 }, { 13, 14, 15 }, { 16, 17, 18 } },
                { { 19, 20, 21 }, { 22, 23, 24 }, { 25, 26, 27 }, { 28 }, { 29, 30 } } };
        String[][] string2dArray = { { "He, llo" }, { "Wo", "rld" } };
        String[] stringArray = { "Hello", "World" };
        Object[] objectArray = { "Hell", 0, "W", 0, "rld" };

        List<Object> mixList = new ArrayList<Object>();
        mixList.add("String");
        mixList.add(3);
        mixList.add(string2dArray);

        System.out.println(flatten(int3dArray));
        System.out.println(flatten(flatten(int3dArray)));
        System.out.println(flatten(3));
        System.out.println(flatten(stringArray));
        System.out.println(flatten(string2dArray));
        System.out.println(flatten(objectArray));
        System.out.println(flatten(mixList));
    }

    private static List<Object> flatten(Object object) {
        List<Object> l = new ArrayList<Object>();
        if (object.getClass().isArray()) {
            for (int i = 0; i < Array.getLength(object); i++) {
                l.addAll(flatten(Array.get(object, i)));
            }
        } else if (object instanceof List) {
            for (Object element : (List<?>) object) {
                l.addAll(flatten(element));
            }
        } else {
            l.add(object);
        }
        return l;
    }
}
Run Code Online (Sandbox Code Playgroud)

它输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
[3]
[Hello, World]
[He, llo, Wo, rld]
[Hell, 0, W, 0, rld]
[String, 3, He, llo, Wo, rld]
Run Code Online (Sandbox Code Playgroud)

这是一个修改后的版本,它还将地图展平为一组值.它可以输出Set或List.

这是我的原始解决方案,它只显示结果,但返回void:

package stackOverflow;

import java.lang.reflect.Array;


public class Solution
{
    public static void main(String[] args) {
        int[][][] array = { { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } },
                { { 10, 11, 12 }, { 13, 14, 15 }, { 16, 17, 18 } },
                { { 19, 20, 21 }, { 22, 23, 24 }, { 25, 26, 27 }, { 28 } } };
        flatten(array);
    }

    private static void flatten(Object object) {
        if (object.getClass().isArray()) {
            for (int i = 0; i < Array.getLength(object); i++) {
                flatten(Array.get(object, i));
            }
        } else {
            System.out.print(object + ",");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

返回:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 ,25,26,27,28,