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,
它是递归的,您不需要更改输入结构,也不需要知道数组的维度.你可以疯狂混合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,