gpt4 book ai didi

Java-使用递归展平数组

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:30 25 4
gpt4 key购买 nike

我一直在练习算法,递归一直是我的弱项。此问题要求将嵌套数组展平为单个数组。如果使用循环给出 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) + ",");
}
}
}

输出: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,

编辑3使用辅助递归后,我几乎找到了答案,但最后一个元素不会添加到数组列表中。

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) + ",");
}
}
}

输出: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,

最佳答案

它是递归的,您不需要更改输入结构,也不需要知道数组的维数。你可以疯狂地混合数组、列表和其他对象,它会返回一个 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;
}
}

输出:

[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]

这是一个 modified version ,这也将 map 展平为值的集合。它可以输出 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 + ",");
}
}
}

它返回: 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,

关于Java-使用递归展平数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40186270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com